読者です 読者をやめる 読者になる 読者になる

子育てしながらエンジニアしたい

現在 2 歳女の子の子育て中エンジニア。子育てとエンジニアを両立するにはどうすれば良いのか模索中。

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 化はまだまだハマりどころがいろいろあるようです。