PyprojとPyinstallerの共存

2020/03 pyprojを使ったプロジェクトを、pyinstallerで.exe化したが、なんかエラー出て上手くいかない。

調べると、結構あるあるらしい。

pyprojは、EPSGコードなどを使って測地系を指定できるが、それは裏にあるPROJ4モジュールのデータに依存している。 その場所が特定できないということらしい。

  • Windows 10
  • Python 3.7
  • pyproj 2.4.1
  • pyinstaller 3.6

datadirモジュールの指定

PROJ4データがどこにあるかについて特定するため、pyprojはpyproj.datadirモジュールを裏で読む。 しかし、pyinstallerはこれが捕捉できないらしい。 (明示的にはimportされていないため?)

これを捕捉されるようにするには、主に2通りあって、

  • スクリプト内のどこか(冒頭がよい)で、from pyproj import _datadir, datadir で明示的に読み込む
  • pyinstallerで初回コンパイルすると.pyと同階層に作成される hogehoge.spec を編集
    • Analysis() に渡す引数の hiddenimports=[] を、['pyproj._datadir', 'pyproj.datadir'] にする

これで、pyinstallerがdatadirを見れるようになる。

これだけで、「従来Pythonが動いていた環境なら」exeも動くはず。

環境変数 PROJ_LIBの指定

Pythonが入っていないような別環境に持っていくには、もう1つ作業が必要となる。

pyproj.datadirは以下のようなコードなのだが、要はこれ自体が“data”dirなわけではなく、datadirがありそうな場所を探すスクリプトである。

pythonも何もインストールしていない環境では、だいたい見つからないでエラーとなる。

Valid PROJ data directory not found. 
Either set the path using the environmental variable PROJ_LIB or 
with `pyproj.datadir.set_data_dir`.

候補の1つに環境変数「PROJ_LIB」を参照しようとしている箇所があるので、これを使えばいけそう。

1ファイルにならないのが何とも残念だが、(やり方次第で1ファイルに収めることが可能なのかも知れないが) ひとまず、

  • pyprojをインストールした環境からdatadirの実データを探して、exe(の出力予定フォルダ)にコピーする
  • pythonコード内で、そのディレクトリに対して「PROJ_LIB」という名で環境変数を定義する

とすれば、動くようにはなる。

datadirの実データは、例えばAnaconda環境であれば、pyprojをインストールした環境(「myenv」とする)でactivateした上で、環境変数を確認すると“PROJ_LIB”が存在している、はず。 そのパスの場所を見ればよい。

> activate myenv
(myenv)> set

Pythonコード内で環境変数を設定するには以下のようにする。

if 'PROJ_LIB' not in os.environ:
    proj_dir = './proj'  # 実データを置いた位置によって任意に変更
    os.environ['PROJ_LIB'] = proj_dir

本WebサイトはcookieをPHPのセッション識別および左欄目次の開閉状況記憶のために使用しています。同意できる方のみご覧ください。More information about cookies
programming/python/packages/pyproj/with_pyinstaller.txt · 最終更新: 2020/03/25 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0