PyQt を py2exe でフリージング

標準的なフリージング

# setup.py

import py2exe
from distutils.core import setup

py2exe_options = {
    "compressed": 1, # 圧縮する
    "optimize": 2,
    "bundle_files": 3,
    "includes" : ["sip",]
}
setup(
    options={"py2exe" : py2exe_options},
    windows=[{"script" : "main.py"}], # PyQt ファイル
    zipfile="[zipped.lib ファイル名]",
)

私の環境 (XP, Py2.6.4) では、 py2exe_optionsbundle_files は 3 (分割ファイル) じゃないと動作しませんでした。

jpeg や gif 等の画像を取り扱う場合

PyQt は bmp や png 以外の画像形式を標準でサポートしていません。その他のフォーマットはプラグインとして提供されています。プラグイン (dll) をフリージングしたファイル配下のディレクトリーに保存する必要があります。

# setup.py

import os
import py2exe
from distutils.core import setup

# 任意のフォーマットの dll を追加。特にアイコンは必要かも
IMAGELIB_DIR = r"C:\path\to\python\Lib\site-packages\PyQt4\plugins\imageformats"
imgfiles = [os.path.join(IMAGELIB_DIR, i) for i in [
    "qgif4.dll",
    "qico4.dll",
    "qjpeg4.dll",
    "qmng4.dll",
    "qsvg4.dll",
    "qtiff4.dll",]]

data_files = [
    ("imageformats", imgfiles), 
]

py2exe_options = {
    "compressed": 1,
    "optimize": 2,
    "bundle_files": 3,
    "includes" : ["sip",]
}

setup(
    data_files = data_files,
    options={"py2exe" : py2exe_options},
    windows=[{"script" : "main.py"}], # PyQt ファイル
    zipfile="[zipped.lib ファイル名]",
)

win32ui を利用する場合

MFC (Microsoft Foundation Classes) の dll が必要 (本家ドキュメント)。

# setup.py

import os
import py2exe
from distutils.core import setup

WIN32UI_DIR = r"C:\path\to\python\Lib\site-packages\pythonwin"
mfcfiles = [os.path.join(WIN32UI_DIR, i) for i in [
    "mfc90.dll", 
    "mfc90u.dll", 
    "mfcm90.dll", 
    "mfcm90u.dll", 
    "Microsoft.VC90.MFC.manifest"]]

IMAGELIB_DIR = r"C:\path\to\python\Lib\site-packages\PyQt4\plugins\imageformats"
imgfiles = [os.path.join(IMAGELIB_DIR, i) for i in [
    "qgif4.dll",
    "qico4.dll",
    "qjpeg4.dll",
    "qmng4.dll",
    "qsvg4.dll",
    "qtiff4.dll",]]

data_files = [
    ("Microsoft.VC90.MFC", mfcfiles), 
    ("imageformats", imgfiles), 
]

py2exe_options = {
    "compressed": 1,
    "optimize": 2,
    "bundle_files": 3,
    "includes" : ["sip", "ctypes",] # ctypes を利用している場合は追加する
}

setup(
    data_files = data_files,
    options={"py2exe" : py2exe_options},
    windows=[{"script" : "main.py"}], # PyQt ファイル
    zipfile="[zipped.lib ファイル名]",
)

py2exe は利用しないライブラリーなども取り込まれるらしく、ちょっとファイルが大きくなってしまいます。私の環境では簡単なウィジェットでも 11 M ぐらいになりました。

コメント

このブログの人気の投稿

Python から Win32 API 経由で印刷する

Disqus のスケール - Django 編

Disqus のスケール - Django で月間80億PVを処理する