差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

次のリビジョン
前のリビジョン
programming:python:packages:pyproj:with_pyinstaller [2020/03/23] – 作成 ikatakosprogramming:python:packages:pyproj:with_pyinstaller [2020/03/25] (現在) – [環境変数 PROJ_LIBの指定] ikatakos
行 7: 行 7:
   * [[https://qiita.com/grinpeaceman/items/5a179fd790cf2dd0b57b|【Python】PyInstallerでExe化すると、No module named 'pyproj.datadir' が出るときの対処 - Qiita]]   * [[https://qiita.com/grinpeaceman/items/5a179fd790cf2dd0b57b|【Python】PyInstallerでExe化すると、No module named 'pyproj.datadir' が出るときの対処 - Qiita]]
  
-pyprojは、EPSGコードなどを使って測地系を指定できるが、それはPROJ4モジュールのバックデータに依存している。+pyprojは、EPSGコードなどを使って測地系を指定できるが、それは裏にあるPROJ4モジュールのデータに依存している。
 その場所が特定できないということらしい。 その場所が特定できないということらしい。
 +
 +  * Windows 10
 +  * Python 3.7
 +  * pyproj 2.4.1
 +  * pyinstaller 3.6
  
 ===== datadirモジュールの指定 ===== ===== datadirモジュールの指定 =====
  
-pyproj.datadirモジュールを裏で読む必要があるのだが、これが明示的にはimportされていないため、pyinstallerが捕捉できない。+PROJ4データがどこにあるかについて特定するため、pyprojはpyproj.datadirモジュールを裏で読む。 
 +しかしpyinstallerはこれが捕捉できないらしい。 
 +明示的にはimportされていないため?)
  
 これを捕捉されるようにするには、主に2通りあって、 これを捕捉されるようにするには、主に2通りあって、
  
-  * スクリプト内のどこか(冒頭)で、''from pyproj import _datadir, datadir'' で明示的に読み込む+  * スクリプト内のどこか(冒頭がよい)で、''from pyproj import _datadir, datadir'' で明示的に読み込む
   * pyinstallerで初回コンパイルすると.pyと同階層に作成される hogehoge.spec を編集   * pyinstallerで初回コンパイルすると.pyと同階層に作成される hogehoge.spec を編集
     * ''Analysis()'' に渡す引数の ''hiddenimports=[]'' を、''['pyproj._datadir', 'pyproj.datadir']'' にする     * ''Analysis()'' に渡す引数の ''hiddenimports=[]'' を、''['pyproj._datadir', 'pyproj.datadir']'' にする
行 22: 行 29:
 これで、pyinstallerがdatadirを見れるようになる。 これで、pyinstallerがdatadirを見れるようになる。
  
-これだけで、「従来Pythonが動いていた環境なら」exeも動く。+これだけで、「従来Pythonが動いていた環境なら」exeも動くはず
  
 ===== 環境変数 PROJ_LIBの指定 ===== ===== 環境変数 PROJ_LIBの指定 =====
  
-別環境に持っていくには、もう1つ作業が必要となる。+Pythonが入っていないような別環境に持っていくには、もう1つ作業が必要となる。
  
-pyproj.datadirは以下のようなコードなのだが、要はこれ自体が"datadir"なわけではなく、datadirがありそうな場所を探すスクリプトである。+pyproj.datadirは以下のようなコードなのだが、要はこれ自体が"data"dirなわけではなく、datadirがありそうな場所を探すスクリプトである。
  
   * [[https://pyproj4.github.io/pyproj/dev/_modules/pyproj/datadir.html|pyproj.datadir — pyproj 2.6.0 documentation]]   * [[https://pyproj4.github.io/pyproj/dev/_modules/pyproj/datadir.html|pyproj.datadir — pyproj 2.6.0 documentation]]
  
-pythonも何もインストールしていない環境では、だいたい全て見つからないでエラーとなる。+pythonも何もインストールしていない環境では、だいたい見つからないでエラーとなる。
  
 <code> <code>
行 42: 行 49:
 候補の1つに環境変数「PROJ_LIB」を参照しようとしている箇所があるので、これを使えばいけそう。 候補の1つに環境変数「PROJ_LIB」を参照しようとしている箇所があるので、これを使えばいけそう。
  
-1ファイルにならないのが何とも残念だが、(そしてpyinstallerの設定によって1ファイルに収めることが可能なのかも知れないが)+1ファイルにならないのが何とも残念だが、(やり方次第で1ファイルに収めることが可能なのかも知れないが)
 ひとまず、 ひとまず、
  
-  * pyprojをインストールした環境からdatadirの実データを探して、exe(出力予定フォルダ)に置く +  * pyprojをインストールした環境からdatadirの実データを探して、exe(出力予定フォルダ)にコピーする 
-  * python内で、そのディレクトリに対して「PROJ_LIB」という名で環境変数を定義する+  * pythonコード内で、そのディレクトリに対して「PROJ_LIB」という名で環境変数を定義する
  
 とすれば、動くようにはなる。 とすれば、動くようにはなる。
  
 +datadirの実データは、例えばAnaconda環境であれば、pyprojをインストールした環境(「myenv」とする)でactivateした上で、環境変数を確認すると"PROJ_LIB"が存在している、はず。
 +そのパスの場所を見ればよい。
 +
 +  > activate myenv
 +  (myenv)> set
 +
 +Pythonコード内で環境変数を設定するには以下のようにする。
  
 +<sxh python>
 +if 'PROJ_LIB' not in os.environ:
 +    proj_dir = './proj'  # 実データを置いた位置によって任意に変更
 +    os.environ['PROJ_LIB'] = proj_dir
 +</sxh>
  
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