Python のソースコードを Windows の EXE 形式の実行ファイルにコンパイルするツールとして
py2exe がある。たぶん、一番よく使われるのがこれ。でも、setup ファイルを書かなくてはならないのが面倒。
cx_freeze の方が、その点楽で setup ファイルを書く必要がない。
FreezePython hoge.py で hoge.exe を作ってくれる。楽なのが一番。Linux でも、実行ファイルを作ることができるというところもいい。
ただし、sitecustomize.py とか読んでないので sys.getdefaultencoding() が ascii になる。UTF-8 にしたい。さもないと LookupError: unknown encoding: utf-8 とかいうことになる(私はソースファイルを UTF-8 で書いているので)。
そこで
initscripts\Console の中に次の行を入れておく。こうしておくと、sys.getdefaultencoding() が UTF-8 になり、エンコーディングのエラーもでなくなる。
from encodings import utf_8
from encodings import cp932
import sys
if hasattr(sys,"setdefaultencoding"):
sys.setdefaultencoding("utf-8")
この手の実行形式のファイルを作ってくれるツールとして他にも
Jungle .Py Compiler がある。これも
jungle hoge.py で実行ファイルを作ってくれる。ただし、環境変数 PYTHONPATH を指定してない場合、ソースと同じ場所にライブラリがないと import している部分が読み込まれない。
set PYTHONPATH=C:\Python24\lib\site-packages とかしてから
jungle hoge.py とするか、-p オプションをつけて
jungle -p C:\python24\lib\site-packages hoge.py のようにしないとダメ。
.Py Compiler の jungle.exe 等、ソースファイルがどこで公開されているのか、あるいは公開されていないのか不明なことと、エンコーディングの問題でエラーが出るのに対して対処方法が分からないのでギブアップ。やっぱりソースコードがあるやつがいい。というか、ないとちょっと不安。PYTHONPATHの指定だけでは、コンパイルできても実行時に import できずにエラーになるものもある。Gnuplot.py を使ったものがだめだった。
cx_freeze に比べると 実行ファイルが若干小さいの、実行速度もちょっと速いようなので、そこはいいところ。System Call の呼び出し回数が少ないので (61716 vs 56467)、そのあたりが効いてきているのかな。
cx_freeze で作ったもの
Version Number: Windows NT 5.1 (Build 2600)
Exit Time: 4:18 pm, Saturday, January 12 2008
Elapsed Time: 0:00:00.390
Process Time: 0:00:00.250
System Calls: 61716
Context Switches: 6470
Page Faults: 6948
Bytes Read: 8084451
Bytes Written: 45268
Bytes Other: 372109
jungle で作ったもの
Version Number: Windows NT 5.1 (Build 2600)
Exit Time: 4:18 pm, Saturday, January 12 2008
Elapsed Time: 0:00:00.375
Process Time: 0:00:00.218
System Calls: 56467
Context Switches: 6651
Page Faults: 5962
Bytes Read: 7526699
Bytes Written: 45232
Bytes Other: 462425
でも、使い勝手とソースコードがあることの安心感とか、最低限のドキュメントがあるとか、使い方が一番簡単、ということで全般的なバランスから cx_freeze がいいかな。