Python で stand-alone バイナリを作る freeze を試してみた

なんとなくふと、Python で stand-alone な実行ファイル作れんのかなーと思って、検索してみたら、以下の FAQ を見付けたので試してみました。

「One is to use the freeze tool, which is included in the Python source tree as Tools/freeze. It converts Python byte code to C arrays; a C compiler you can embed all your modules into a new program, which is then linked with the standard Python modules.」とのことで、C ソースに変換してコンパイルできるみたいです。


これを試してみたので、そのメモです。

環境


なんとなく、さくらの VPS 上で作業しました。Ubuntu 10.04 です。

 $ python -V
python 2.6.5

対象ファイル

Hello, World を吐く Python スクリプトを変換してみます。

 $ cat hello.py
#!/usr/bin/env python

print "Hello, World"

# hello.py ends here.

準備

以下のパッケージを入れます。これらの他に gcc や make のようなツールが必要です。build-essential あたりを入れておけば大丈夫に思います。

  • python2.6-examples
  • python2.6-dev
  • libssl-dev

python2.6-examples は、freeze.py を手に入れるために入れます。freeze.py が無いとバイナリが作れません。
python2.6-dev は、こいつを入れていないと、python ファイルから C ソースファイルを変換するときに「config.c.in」が無いと言われて変換に失敗します。
libssl は、変換した C ファイルをビルドするときに必要となります。


ただし、これだけでも駄目です。以下の差分を /usr/share/doc/python2.6/examples/Tools/freeze/makeconfig.py に適用する必要があります。

これを適用しないと、「undefined reference to `init_warnings'」と言われ、ビルドが成功しません。

手順

以上の準備が完了したら、以下のようにコマンドを叩きます。

 $ python /usr/share/doc/python2.6/examples/Tools/freeze/freeze.py ./hello.py
 $ make

C ソースへの変換は、python コマンドにfreeze.py ファイル、変換したい Python ファイルの順に渡します。
すると問題がなければ、大量の C ファイルと Makefile が作られるはずです(計13万行ぐらい)。
あとは、make と実行するだけです。

成果物

出来上がったバイナリは以下のような感じです。

 $ file ./hello
./hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
 $ du -sh ./hello
4.3M    ./hello

とまあ、けっこう馬鹿でかいファイルができあがります。もちろん出来上がったモノは普通に実行できます。

まとめ

とまあ以上のような感じです。作成が目的だったので、実行速度の差等は全然計測していません。
strip してもバイナリは、4Mぐらいなので、やっぱりちょっと大きいのが気になります。
なんとかもっと小さくできないのかなあとか思いながら、そんなこんなで。

更新時刻

  • 2011/12/30/00:20