読者です 読者をやめる 読者になる 読者になる

PyQtでつくったアプリのパッケージングとインストーラの作り方

ここ最近、PyQtを使って以前公開した株価取得ライブラリのGUI化をやってたら思いの外楽しかったのだけど、インストーラーとかパッケージングとかそのあたりがまあ面倒くさくてまあダルい。
ごにょごにょいろいろ試してようやく動くっぽくなったので忘れないうちに書くけれども、深い理解まで至っていないので間違いがあるかも。
MacとWindowsの両方。
実行環境は、Mac OSX 10.6.8とWindows7。
Pythonのバージョンは2.7.2。当初は3.2でいこうとしていたのだけど、使用ライブラリが3系に未対応だったので2.7.2。

作ったアプリ

ある銘柄の指定期間の株価(当日の高値, 安値, 終値, 出来高)をcsv形式でファイルに書き出すツール。

Mac版はこちら
Windows版はこちら

ソースコードはこちら

レジストリとかは未使用。
SnowLeopardだと微妙にうまく動かないかもしれない。Lionでは問題なし。
QCalendarWidgetを使うと落ちるような。謎。

Mac

使ったもの:py2app

py2appは、フツウにeasy_installもしくはpipからインストール。
サンプルをそのまま実行したら以下のようなエラーが出た。

  
error: argv-emulation is not supported for 64-bit executables  

argv-emulationが何の役割を果たしているのかはよく分かっていないのだけど、いろいろごにょごにょやったあげく最終的にsetup.pyのargv_emulationをFalseにして逃げた。
当初は、universalなPythonだったりQtだったりをインストールして32-bit版で動かそうとしてみたのだけど、まーどうにもうまく動かなかったので諦め。

他はとくに問題なくドキュメント通りにsetup.pyを作成して以下のコマンドを叩いたらパッケージングされた。

  
$ python setup.py py2app  

参考ソース:setup.py

Windows

使ったもの:py2exe, innosetup

py2exeはこのあたりからインストーラをダウンロードしてきてインストール。
innosetupはまずこのあたりから本家をダウンロードしてきてインストール。
手元の環境では、isetup-5.4.2.exeを入れた。
そのあとこのあたりからpywin32をダウロードしてきてインストール。
最後にここからinnosetupのzipをダウンロードしてきて解凍して中身(innosetup.py)を作業ディレクトリに置いた。

こちらもサンプルをそのまま実行するだけではうまく行かず、手元の環境ではinnosetup.pyの794行目あたりのBOMを付けてる部分がどうやら悪さをしているようで、そいつをコメントアウトしたら動作した。
innosetupのChangeLogを見ると0.6.3からBOMをつけてるっぽいのだけど、理由は不明。
コメントアウトしたソースはこちら

あとはサンプル通りにsetup.pyを書いて以下のコマンドを実行するとsetup.exeが作成された。

  
> c:\Python27\python.exe setup.py innosetup  

参考ソース:setup.py

おしまい

簡単そうに見えたのだけど意外とハマりどころが多かったし、ただ単にパッケージングとsetup.exeを作成するだけで1日かかってしまった。
深く理解するとしたらもっとずっとかかると思われる。
クロスプラットフォームなアプリは簡単にかけて良いのだけど、パッケージングの方法がそれぞれ異なるので、なにかと面倒に感じてしまった。

参考

PyQt でクロスプラットフォームなデスクトップアプリケーションを -- Kosei Kitahara's Blog
How-to: Deploying PyQt applications on Windows and Mac OS X