#cx_freezeまたはPyInstallerでpython programを1ディレクトリにまとめる。
##はじめに
cx_freezeや、PyInstallerは、pythonの実行環境を1つのディレクトリにまとめ、別環境への移動、実行環境の固定を容易にするツールです。
Windowsでは同様のツールとしてpy2exeが有名ですが、linuxではcx_freeze,PyInstallerが使用できます。ここではその2つでmatplotlibを使ったサンプルプログラムを変換して、比較をおこないました。
##sample program
0から99までの整数を生成しグラフを書く
import matplotlib.pyplot as plt
import numpy as np
a=np.arange(100)
plt.plot(a)
plt.show()
$ python mat.py
の結果は
のようなインタラクティブなグラフです。
cx_freeze
このmat.pyを
$ cxfreeze --version
cxfreeze 4.3.4
Copyright (c) 2007-2013 Anthony Tuininga. All rights reserved.
Copyright (c) 2001-2006 Computronix Corporation. All rights reserved.
$ cxfreeze-quickstart
Project name: mat
Version [1.0]:
Description:
Python file to make executable from: mat.py
Executable file name [mat]: mat
(C)onsole application, (G)UI application, or (S)ervice [C]: C
Save setup script to [setup.py]:
Overwrite setup.py [n]? y
Setup script written to setup.py; run it as:
python setup.py build
Run this now [n]? y
その後たくさんのメッセージが表示されて成功したかのように見えますが、いざ実行すると
$ ./build/exe.linux-x86_64-2.7/mat
....
ImportError: No module named backend_qt4agg
と不足するモジュールが指摘されます。
そこでcxfreeze-quickstartが生成した setup.py
の
buildOptions = dict(packages = [], excludes = [])
部分に includesの部分を追加します。
buildOptions = dict(packages = [], excludes = [],
includes=["matplotlib.backends.backend_qt4agg"])
$python setup.py build
を実行すると./build/exe.linux-x86_64-2.7/mat
は今度は実行できようになりました。
PyInstaller
pyinstaller ( v.2.1.1 dev) の場合はもっと簡単です。 $ pyinstaller mat.py
で ./dist/mat/mat
が生成され、これは問題なく動作しました。
比較
それならば、面倒の無いpyinstallerの方がベターかといえばそうでもないようです。両者の比較をすると
tool | コンパイル時間 | ディレクトリサイズ | 実行時間 |
---|---|---|---|
cx_freeze | 8s | 71M | 1.8s |
pyinstaller | 50s | 206M | 1.9s |
ちなみに $ python mat.py
を実行したときの実行時間は1.5secでした。
またpyinstallerではこのテストプログラムでは問題なくコンパイル/実行できたものの他のモジュールをimportした場合100%成功するとは限らないことがわかりました。もしimportに失敗じた場合には、メインプログラムでimportすると良いことがわかりましたが、メインプログラムにそこでは使わないモジュールをimportしておくのも不自然ですし、うっかり消去してバグの元になる可能性もあります。
結論 (一応)
cx_freezeは生成されるディレクトリのサイズ、生成速度、実行時間から見てpyinstallerより優れていると思われます。また不足するモジュールの追加などの管理機能もsetup.pyに一元化されておりこれもpyinstallerと比較して優れていると言えます。