PyInstallerを使うと、Pythonで作ったプログラムを実行ファイルに変換できるので、とても便利です。しかも、以下のような感じで書くと、ライブラリも全部まとめて一つのファイルになります。かなり便利。
test.pyをtest.exeに変換する方法:
$ pyinstaller test.py --onefile
PyInstallerのインストール
以下のようにpipを使って、PyInstallerをインストールできます。
$ pip install pyinstaller
エラーが出る場合 - PythonバージョンやmacOS
macOSや新しいPythonのバージョンの対応は遅れています。対応バージョンを使いましょう。
エラーが出る場合 - 暗黙的なインポート
暗黙的なインポートがある場合、エラーが出ます。以下のように、『--hidden-import=パッケージ名』を追記することで暗黙的なモジュールも追記します。
$ pyinstaller -F --hidden-import="sklearn.utils._cython_blas" --hidden-import="sklearn.neighbors.typedefs" --hidden-import="sklearn.neighbors.quad_tree" --hidden-import="sklearn.tree._utils" test.py
また、プログラム内に「import xxx」と暗黙的なモジュールを記載しておくこともできます。
EXE化すると __file__ や __dir__ は使えない
そこで、exeファイルのパスはsys.argv[0]で取得します。
import os, sys
exe = os.path.abspath(sys.argv[0])
exe_dir = os.path.dirname(exe)
--onefile オプションをつけると起動が遅くなる
なお、--onefile オプションをつけてEXE化すると、一つのファイルを配布するだけですむので便利だが、その分、起動が遅くなります。起動時にファイルを展開してから実行するため。
どのくらい遅くなるのかベンチマーク。
コマンドラインに渡した文字列を表示するだけのプログラムを5回実行してみたところ、以下のようになりました。
| オプション | 経過秒数 |
|-----------+---------|
| --onefile | 1.44sec |
| なし | 0.74sec |