はじめに
PyInstallerの使い方とエラーが出た場合の対処法について記載。
発端
以前、嫁に言われて日経平均を予測するPythonコードを書いた。
以下が、日経平均を予測した時の記事。興味ある方はどうぞ。
https://www.simulationroom999.com/blog/stock-forecast-lstm/
反応はイマイチだったが、一応作ったので引き渡そうとは思う。
しかし、嫁にPython環境構築とかやらせるのも一苦労。
というわけで、exe化して渡すことにした。
しらべたところ、PyInstallerでexe化できるらしいが、ちょこっと引っかかるところもあったので備忘録として残す。
Pypi.org PyInstaller
https://pypi.org/project/pyinstaller/
PyInstallerのインストール
pipでインストールすればOK。
pip install PyInstaller
exe化
pythonコードをpyinstallerに渡せばOK。
pyinstaller [pythonコード]
大量のDLLが丸見えなのが嫌な場合は1ファイル化することもできる。
pyinstaller [pythonコード] --onefile
Console出したくない場合は以下のように”–noconsole”を指定する。
pyinstaller [pythonコード] --noconsole
ちなみに、1ファイル化すると、起動がかなり遅くなる。
どうやら、内部的にはDLL群がzipで固められているだけのようなので、その展開に時間が掛かっている様子。
発生した問題
以下のようなエラーが発生。
File "c:\programdata\anaconda3\lib\site-packages\PyInstaller\hooks\hook-zmq.py", line 20, in <module>
hiddenimports = ['zmq.utils.garbage'] + collect_submodules('zmq.backend')
File "c:\programdata\anaconda3\lib\site-packages\PyInstaller\utils\hooks\__init__.py", line 626, in collect_submodules
repr(pkg_dir), package))
File "c:\programdata\anaconda3\lib\site-packages\PyInstaller\utils\hooks\__init__.py", line 85, in exec_statement
return __exec_python_cmd(cmd)
File "c:\programdata\anaconda3\lib\site-packages\PyInstaller\utils\hooks\__init__.py", line 74, in __exec_python_cmd
txt = exec_python(*cmd, env=pp_env)
File "c:\programdata\anaconda3\lib\site-packages\PyInstaller\compat.py", line 641, in exec_python
return exec_command(*cmdargs, **kwargs)
File "c:\programdata\anaconda3\lib\site-packages\PyInstaller\compat.py", line 431, in exec_command
out = out.decode(encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x95 in position 137: invalid start byte
compat.pyの中のout.decodeに何かを入れた際にエラーになった様子。
pythonコード内のコメントが日本語なので、それが引っかかったのかもしれない。詳細は不明。
とりあえず、compat.pyを編集
方針は「エラーをignore指定で押し切る」
上記エラーの場合、compat.pyの431行目を修正。
# out = out.decode(encoding)
out = out.decode(encoding, errors='ignore')
複数のPythonプクリプトを1つにしたい場合。
pyinstallerが勝手に依存関係を調べてくれるので、引き渡すPythonスクリプトはエントリポイントになるものだけを指定すれば良い。
顛末
嫁のPCスペックがショボすぎてメモリ不足で起動直後に落ちた。
以下が、日経平均を予測した時の記事。興味ある方はどうぞ。
※ 参考記事
コメント