Freezeしてバイナリパッケージを作ろう!
バイナリパッケージャの基礎
紹介したバイナリパッケージャの役割は、 以下のようなファイルセットをひとつのフォルダに詰め込んでくれるというものです。
- 起動用実行ファイル
- python-VMランタイム
- 依存ランタイム
- ライブラリまたはライブラリアーカイブ
- アプリが必要とするその他のファイル
必要なファイルがすべて揃えば動作させることは比較的容易なんですが、 必要なファイルがどれなのかを発見する事がパッケージャの重要な機能で、 以下の2つの機能が提供されています。
- 依存ランタイムの検索
- 利用しているライブラリの検索
また、アプリが必要とするファイルはパッケージャに教えてあげなければいけませんので、 複数の指定ファイルまたは指定フォルダを結果に含める機能があります。
紹介したパッケージャのどれをつかうにしても、依存検索をさせて 「検索に漏れたファイル」や「アプリが必要なファイル」を追加指定するというのが 基本的な使い方になります。
大きめのアプリをパッケージングする場合、 設定ファイルやプラグインなど、別のフォルダに分離しておきたいファイルを 検索から除外して「アプリが必要なファイル」として扱うようにすることも必要になります。
やっかいなところ
困るのは、依存してんだけどパッケージに含めて配布しちゃダメなものがあること。
- ひとつはライセンス的にだめだろうなファイル
- もうひとつはWindowsSideBySideテクノロジーで配布されているランタイム
- まれに、OSのバージョンに依存したランタイム
といったものがあります。 WinSxSという単語をググればいろいろ情報が得られますが、 WinSxSが導入される前は実行ファイルのそばにランタイムを置けば、 ちゃんと読み込んで機能してくれたんですが、 例えばmsvcr90.dllは実行ファイルのそばに置くだけでは利用できません。
例えば・・・
msvcrだけを一緒にバンドルする方法はいろいろやってみましたが、 配布制限に関するマニフェストファイルを作ってpythonをVCでリビルドするしかないようです。
DirectXのジョイスティックライブラリ「dxinput.dll」はWindows2000用とXP以降とで 設計が違うので、アプリにバンドルしてはいけません。(ファイル名一緒なのかよ!)
結局Microsoftが配布するランタイムは専用のインストーラでいれてもらうのが無難です。
freeze手段の一覧
バイナリパッケージャの一覧
py2exe
特徴:
- Windows専用
- 歴史が長い
- eggモジュール依存を解決できない
- exeの中に依存dllをバンドルする機能あり。
py2exeの支援ツールとして
というのがあり、これはGUIで漏れたファイルを追加したり、データファイルを追加したりできます。
py2app
特徴:
- Mac専用
pyInstaller
特徴:
- Windows,Linux兼用
bb_freeze
特徴:
- Windows,Linux兼用
- 賢い依存検索が売り
- 他のツールより遅い
cx_freeze
特徴:
- Windows,Linux兼用
- 動作が軽い
- 無難なパッケージング
exemaker
厳密にはこれはバイナリパッケージャではありません。 スクリプト起動を肩代わりするexeを生成するだけのツールです。
コマンドラインからの呼び出しがお手軽にできるので、 1ファイルのユーティリティ系スクリプトに向いています。 (ただし実行にはPython環境がインストールされている必要があります。)
GUI2exe
上記で紹介したパッケージャの殆どに対応したGUIによるパッケージング支援ツール
http://code.google.com/p/gui2exe/
足りない依存ファイルがあればそれを教えてくれる機能があったり、 setupスクリプトを生成したりする機能があります。
このツールの実行にはパッケージャのいずれかとwxpythonの2.8.8以降が必要です。
まとめ
ざっとバイナリパッケージングの支援モジュールやツールをご紹介しました。
パッケージングした結果をそのフォルダごと持ち出せば、どの環境でも動くという ポータビリティは時としてとても必要になることがあります。
WinSxSのおかげでそのメリットは若干低下していますが、 「vcredist_x86.exe」などの再配布用インストーラが配布されていますので、 それらと一緒に持ち歩けば、どこでもすぐに動かすことができます。
次はその配布ファイルをインストーラにしてしまえば、PC初心者にも使ってもらえる アプリケーションを配布することができるようになります。