Python スクリプトを exe ファイル化したい
Python スクリプトを exe ファイル化したい
Python の良いところにはマルチプラットフォームで動くというのがありますが、
良くない、というか仕方ないところは、そのための実行環境を入れないといけません。
自分で使う分には良いですが、人に使わせるとなると、そこがハードルになります。
そのハードルを取り除くため、Windows 環境で動く exe ファイルにする方法を調べました。
方法
調べるといくつか方法があるようです。
ざっと情報を調べてみると、こんな一長一短があるようです。
py2exe | PyInstaller | cx_Freeze | 備考 | |
---|---|---|---|---|
Python 3.5 対応 | × | ○ | ○ | py2exe は Python 3.4 まで |
処理時間 | ○ | × | ○ | 参考記事 |
プラットフォーム | × | ○ | ○ | py2exe は Windows 向けのみ |
シングル exe ファイル | ○ | ○ | × | cx_Freezeは 1 ファイルにまとめられない |
処理時間とシングル exe ファイルができることから、py2exe を選びたかったのですが、
Python 3.5 に非対応だったので諦め...
ということで PyInstaller と cx_Freezeを試してみることにしました。
変換する Python スクリプト
tkinter GUI アプリケーションを変換したかったので、とりあえず簡単なテストアプリを作りました。
ファイルダイアログで選択したファイルパスを出力するだけです。
PyInstaller
導入
pip install で導入します。
$ pip install pyinstaller
変換
シングル exe ファイルで、コンソール画面を出さないようにしてみました。
といってもそれぞれ -F, -w オプションをつけるだけです。
$ pyinstaller -F -w tkinter2exe.py
これだけで、dist ディレクトリの下に tkinter2exe.exe ができました。
起動
ちゃんと起動しました。
が遅い!!
感覚で言うと 4 秒くらいかかるような感じです。
ちなみに Python として起動したときは 1 秒もかかりません。
なおファイルサイズは 8.47 MB になりました。
cx_Freeze
結果的には、こちらはうまくいかずでした...
導入
pip install で導入します。
$ pip install cx_Freeze
変換
ここ を参考に以下のようなコマンドを叩きました。
$ cxfreeze tkinter2exe.py --target-dir dist
これでは cxfreeze が起動せず。
以下のようにちょっと修正。
$ python C:\Users\[Username]\Anaconda3\Scripts\cxfreeze tkinter2exe.py --target-dir dist
これでとりあえず cxfreeze は動くようになったのですが TCLが見つからないというエラーが出ます。
環境によるようなのですが、Stack overflow の情報をもとに環境変数を追加しました。
$ set TCL_LIBRARY=C:\Users\[Username]\Anaconda3\tcl\tcl8.6\ $ set TK_LIBRARY=C:\Users\[Username]\Anaconda3\tcl\tk8.6\
これで改めて
$ python C:\Users\[Username]\Anaconda3\Scripts\cxfreeze tkinter2exe.py --target-dir dist
こうして、dist フォルダの中に tkinter2exe.exe ができた。
起動
さて起動、、と思ったら起動せず...
setup.py を作ってみたり、いろいろやってみたものの、うまくいきませんでした。
まとめ
本当は py2exe, PyInstaller, cx_Freezeの比較までいきたかったけれど、
現時点では PyInstaller しか使えませんでした。
どうも Python の環境 (自分は Anaconda) にもだいぶ依存するようなので、
exe 化はまだまだハマりどころがいろいろあるようです。