PyQt4で画像を扱うアプリケーションをMac OS X上でバンドルする

MacPorts入れる

まっさらなMacに、XcodeMacPortsを導入する。
んで、

sudo port install python26 py26-pyqt4
sudo python_select python26

とすれば、開発環境が整う。かなりコンパイル時間がかかるので注意。

バンドルする

Mac OS Xで配布用バイナリ(.appのディレクトリ)にbundleするには、
py2appが定番のようだ。


んで、py2appでサックリ.appを作ってみたけど、画像の読み込みがうまくできない。
Qtのimageformatsプラグインの読み込みに失敗しているのであろう。


Mac OS Xの動的ライブラリには、dylibとbundleの2つの形式があるらしい。
Mach-Oの仕様で決まっているんだって。
dylibは共有ライブラリ、bundleは動的にロードできるモジュール、ということ。


dylibもdlopen()で開くことができるんだけど、dlclose()はできないっぽい。
bundleはdlopen()/dlclose()両方OK。
(本当は別のAPI群があるらしいけど、どうせラッパ関数しか使わないからねー)


Mac OS XでQtのimageformatsは、bundle形式で提供されている。
というわけで、data_filesにbundle形式のライブラリを突っ込めばおk、
なのかと思ったらうまくいかない。


py2appでバンドルした場合には、どうやらbundleの読み込みがうまくいかないようだ。
py2exeでbundle_filesを3以外に設定したときと同じようなエラーメッセージが表示される。


strace的なもので共有ライブラリのロードを調べたい。Macの場合にはktraceがそれにあたる。
もしくは、おそらくpy2appはpy2exeのbundle_filesが3以外の挙動と似ている可能性があるので、
py2exeのほうで問題を追ったほうが理解しやすいかもしれない。
なにせ、Macでの開発は経験が足りないからねー…


PyInstallerの場合にはもしかしたらimageformatsの読み込みに対応しているのかもしれない、
という希望があったりします。
対応していなくても、開発が動いているのであればパッチも送れるし。
そうすると、Windows版の.exe作成もPyInstallerでいいじゃん、という話になり、
結局cx_Freeze->py2exe->PyInstallerと全部試してしまうことになる悲しい結末です。
でも、PyInstallerってWindows上で使いづらいんだよねぇ…