pythonコードを単体で動くexeにしたいとき、pyinstallerが便利だったのでメモ。
やりたかったこと
TensorFlowで構築したモデルを、PCに詳しくない人にも使ってもらえるようにしたい。
TFモデル構築・保存
→hd5ファイルを呼び出して推論するpyファイルを作成
→そのpyファイルをexe化
→exeファイルをローカルに置くだけでwindows上で使えるように
というイメージ
環境
Windows 10 64bit
Anaconda (python 3.5)
インストール
pyinstallerはpyファイルをコマンド一発でexeファイルに変換してくれる便利なやつ
pip install pyinstaller
exeファイル作成コマンド
--onefileオプションを付けるとexe単体で実行出来るようになる
pyinsaller PATH/hogehoge.py --onefile
出てきたエラー
ライブラリが見つからないよエラー
conda環境で実行したファイルをexe化したためか、以下のようなエラーが出た。
OSError: Python library not found: libpython3.5m.so.1.0, libpython3.5mu.so.1.0, libpython3.5.so.1.0
その場合はconda環境のライブラリが置いてあるパスを共有ライブラリ検索パスに追加する。(私の場合は/home/USER_NAME/anaconda3/lib だった)
出来たファイルが実行出来ない?
いくつかの手順を踏んで無事ファイルが出来た...!と思いきや、何故かexeファイルが実行出来ない。
ここで初めて気付くが、コマンド実行していたのがlinuxだった。実はwindowsで使用するためのexeは、windowsOSでの作成が必須らしい。ということでwindowsPCに切り替えて実行。無事exeファイル化出来ました。
とにかくexeのファイルサイズが大きい
無事に出てきたexeファイルだったが、今度は「ファイルサイズ、大きくない...?」問題が出てきた。
ということで色々調べていると、同じことを考えている人がいた。先人の知恵ありがたい...
[Anaconda] Pyinstallerで生成される実行ファイルを数百MB -> 数十MBに削減する方法
(https://qiita.com/napinoco/items/068ce8ef6ef4309966b1)
しかし、結論、今回はファイルサイズをうまく小さくすることが出来なかった。というのも、今回はTFで比較的複雑な演算をしており、上記リンクにあるような解決策をそのまま応用することが厳しそうだったためである。これについては他にやり方がないか調査中。
pyファイルでのファイルの呼び出し方
exeファイルを配布することを考えると、絶対パスをベタ書きだとファイルの呼び出しエラーが出てしまう。今回はpyファイル内で自分のパスを取得して、そこを基点にファイルを呼び出す形式を取った。