【Python】嫁に株価予測をリリース【PyInstaller】

Python

はじめに

PyInstallerの使い方とエラーが出た場合の対処法について記載。

発端

以前、嫁に言われて日経平均を予測するPythonコードを書いた。

以下が、日経平均を予測した時の記事。興味ある方はどうぞ。
https://www.simulationroom999.com/blog/stock-forecast-lstm/

反応はイマイチだったが、一応作ったので引き渡そうとは思う。
しかし、嫁にPython環境構築とかやらせるのも一苦労
というわけで、exe化して渡すことにした。
しらべたところ、PyInstallerでexe化できるらしいが、ちょこっと引っかかるところもあったので備忘録として残す。

Pypi.org PyInstaller
https://pypi.org/project/pyinstaller/

pyinstaller
PyInstaller bundles a Python application and all its dependencies into a single package.

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スペックがショボすぎてメモリ不足で起動直後に落ちた。

以下が、日経平均を予測した時の記事。興味ある方はどうぞ。

※ 参考記事

コメント

タイトルとURLをコピーしました