Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

cx_freeze or PyInstaller ?

More than 5 years have passed since last update.

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

yamas8
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away