bbfreezeでバイナリ作成

クロスでバイナリ作成

tags:python, module. tips,frozen, binary, deveropment, distribution
created:2007-10-23T11:25:12

フローズンバイナリ作成のもうひとつの方法 py2exeほど柔軟ではないけれど。

概要

bbfreezeというパッケージがcheese-shopにでてます。 bbfreezeでバイナリ作成してみると簡単にスマートな出力が得られました。

依存パッケージやDLLの探索に時間は掛かるようですが 抽出されたファイル群がかなり最適な分量。

py2exeは疑わしきものはすべて含むという感じだったので膨れやすい。 py2exeほどカスタマイズできないんですが、堅実なパッケージングなので、 フローズン前と後の挙動差がほとんどないのが特徴です。

あと、py2exeにはない「 eggパッケージ [1] 」の探索にも対応しています。 最新のPy2Exeはサポートしている?

配布フォルダにはインタラクティブコンソール用exeも付属していて、 対話モードデバッグすることも可能です。

また、Linuxもサポートしています。

[1]eggパッケージやeasy_installはsetuptoolsというモジュールを使っています。 eggはモジュール群やパッケージ群に付加情報をパックしたものです。

インストール

easy_install -U bbfreeze

こんだけ。

easy_installはsetuptoolsをインストールすれば使えます。 インストール方法はGoogleさんに聞いてみよう。

フローズンサンプル

以下のようなスクリプトを作成、 実行すればsample.pywをフローズン化したものをdistフォルダに出力します。

from bbfreeze import Freezer
f = Freezer("dist", includes=('ogre',), excludes=('DINPUT8.dll',))
f.addScript("sample.pyw", True)

f()    # starts the freezing process
includes
特別含みたいパッケージ名やモジュール名やDLL名を。
excludes
含まれたくないパッケージ名やモジュール名やDLL名を記述します。
addScriptの第二引数
コンソール画面が不要ならTrueをコンソールアプリならFalseを。

以上です。じつにシンプル!

検索処理は結構重くて少し待ちが長いので気長にお待ちください。

現在わかっている注意点

以下のフォルダに「*.egginfo」というフォルダがあると、

C:\Python25\Lib\sitepackages\

「dist\その名前のフォルダ」の中にsite-packagesの内容すべてを 取り込むなんていうおかしな動作をしました。

「*.egginfo」フォルダは通常利用では不要な情報なので削除しておいてください。 (一部のパッケージをインストールした時に作成されます。)

あと、python-ogreアプリの場合ogreランタイムが参照している DINPUT8.DLLを見つけてdistフォルダに入れてくれるのはいいんですが、 DINPUT8.DLLはWinXPとWin2Kとで違う内容らしい。

  • WinXPでフローズン->Win2Kで動かない
  • Win2Kでフローズン->WinXPで動かない

ということになります。 で、システムフォルダのDINPUT8.DLLを使ってもらうために、 除外する必要があります。

結論

あっさりとexeを作って動くのは依存探索が賢いからでしょう。 (時間掛かりますけどね)

exeアイコン指定ができないのですが、 当然LinuxとWindowsで手法が違うのでしかたないところでしょう。

それよりも、Linuxでもバイナリ配布できる点のメリットが大きいでしょう。

インストーラ作成のときショートカットアイコンを 指定する形で見栄えを良くすることができるでしょう。

wxPythonやpython-ogreアプリのフローズンにて問題なく動作しています。

余談ですが「フローズン」って書くと涼しげでいいですね~

追記(2011/5/3)

最近は「cx_Freeze」をよく使っています。 こちらの特徴は1フォルダにバイナリとライブラリアーカイブを構築する というシンプルな目的に特化しており、 多くのプラットフォームやPythonバージョンをサポートしています。