PyQt4 と PyInstaller と Windows と

PyQt4 を使ったプログラムを書いてる。 一応、 Windows 版も作ろうと PyInstaller を使って EXE ファイルを作っているのだけど、 jpeg 画像が読みこめなかった。

PyQt4 でインストールされる Qt は jpeg を plugin で読みこみ、その plugin が配布ファイルに含まれていなかったことが原因だった。

この plugin の探索パスが普通予想するようなカレントディレクトリではないことに注意。

http://www.kde.gr.jp/pukiwiki/index.php?Qt%20Reference%20Documentation%2F%B3%B5%CD%D7%2FQt%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3HowTo

plugin base classには5つの種類があり、生成されたプラグインはデフォルトでは標準のプラグインディレクトリに保存されます。

Base Class Default Path
QImageFormatPlugin? pluginsbase/imageformats*
QSqlDriverPlugin? pluginsbase/sqldrivers*
QStylePlugin? pluginsbase/style*
QTextCodecPlugin? pluginsbase/codecs*
QWidgetPlugin? pluginsbase/designer*

とは言え pluginsbase ディレクトリはどこにあるのだろうか。アプリケーションが実行される時、Qtは最初にアプリケーションの実行ディレクトリを pluginsbase として設定します。例えば、アプリケーションがstyleプラグインを所有していてC:\Program Files\MyApp?で実行された場合、QtはC:\Program Files\MyApp?\stylesを探索します。 (アプリケーションの実行ファイルがどこにあるかはQApplication::applicationDirPath?()を用いて参照します) また、QtはqInstallPathPlugins?()によって与えられたディレクトリの中も探索します。もしQtにもっと別の場所を探索するようにしたい場合は必要に応じてQApplication::AddLibraryPath?()呼び出してを追加して下さい。独自のパスをセットしたいなら、QApplication::setLibraryPaths?()を使って下さい。

この場合は、 "./imageformats" に qjpeg4.dll, qjpegd4.dll をコピーしてやれば無事に読めるようになった。