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 ソースに変換してコンパイルできるみたいです。
これを試してみたので、そのメモです。
対象ファイル
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