13
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

cx_freeze or PyInstaller ?

Posted at

#cx_freezeまたはPyInstallerでpython programを1ディレクトリにまとめる。

##はじめに
cx_freezeや、PyInstallerは、pythonの実行環境を1つのディレクトリにまとめ、別環境への移動、実行環境の固定を容易にするツールです。
Windowsでは同様のツールとしてpy2exeが有名ですが、linuxではcx_freeze,PyInstallerが使用できます。ここではその2つでmatplotlibを使ったサンプルプログラムを変換して、比較をおこないました。

##sample program

0から99までの整数を生成しグラフを書く

mat.py
import matplotlib.pyplot as plt
import numpy as np

a=np.arange(100)
plt.plot(a)
plt.show()

$ python mat.py の結果は
gp.png
のようなインタラクティブなグラフです。

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と比較して優れていると言えます。

13
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?