pythonをpyinstallerで実行ファイル化する際の試行錯誤
概要
統計検定の勉強以外の初投稿。
最近仕事でpythonのコードを実行ファイルで渡す必要が出てきたので調べたところ、pyinstallerというライブラリを知り、使ってみた。
いくつかエラーがでて試行錯誤したので記録に残しておく。
インストール
condaでインストールした。いくつかの記事を見たところ、condaで入れると容量が大きくなるらしいのでpipなどで入れたほうが良かったかも。
再起エラー
maximum recursion depth exceeded while calling a Python object
というエラーが出る。これは以下の方法で解消した。再帰の上限を勝手に設定しただけなので良いのか不明だが、一応動いた。
①specファイルを作成
pyinstaller hoge.py --onefile --windowed
を実行、これだけだとエラー、.specファイルができる。
②specファイルを修正してコンパイル
specファイルの一番上に下記のコードを追加
import sys
sys.setrecursionlimit(20000)
その後specファイルを指定してコンパイル
pyinstaller hoge.spec --onefile --windowed
動作も元のpythonコードと同様だった。ただ実行時間がpythonだと数秒、実行ファイルだと1分位とかなり長くなる。あと何故かトレンドマイクロのプロセスのCPU使用率が高くなる。
謎エラー
その後いくつかコードを修正し実行すると、以下のようなエラーが出た。
fatal error detected failed to execute script pyinstaller
これだけだと原因がよくわからないのでコードを変更してエラー箇所を確認すると、以下の部分を加えることでエラーが発生していた。
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
pyinstaller sklearn などのキーワードでググるといくつか関連記事を発見。以下の記事を参考に解決できた。
しかし別のエラーが発生。
this application failed to start because no qt platform plugin could be initialized
エラー文でググるといろいろ出てきて、以下の記事が参考になった。
最終的にやったこと
- conda install -c anaconda pyqt
- C:\Users\<username>\envs\<environmentname>\Library\plugins\platformsをexeの入ったフォルダの/dist以下にコピーする。
- C:\Users\<username>\Anaconda\lib\site-packages\PyQt5内のdllを/dist以下にコピーする。
所感
使う分には楽だけど、結構挙動が怪しい。一応今はコンパイル・実行で動作するけど、これ以降もなにか追加・修正したときに別の問題が起きそう。
実行にも時間かかるしなにか別の使いやすいものが出ると良いな~。