結局のところ、GTK+ のbin など、share および libディレクトリをプロジェクトの dist ディレクトリにコピーするという標準的な答えは正しいです (しかし、誰かが破壊行為を行って [1]、
binがリストに表示されていません)。
- PyGTK は、Python で GTK+ を利用できるようにする接着剤の薄い層にすぎません
- PyGObject は、GObject、GIO などを Python で利用できるようにする接着剤の薄い層にすぎません
- PyCairo は、Cairo を Python で利用できるようにする接着剤の薄い層にすぎません
少なくとも、これら 3 つのバインディング パッケージすべてが必要であり、その性質上、基盤となるプラットフォーム (.dll ファイル、構成ファイル、要するに: シバン全体) が利用できない場合は役に立ちません。そのため、GTK+ の
bin など、share および libをプロジェクトの dist ディレクトリにコピーする必要があります。
しかし、私が数年前に [1] に投稿した setup.py フラグメントは微妙に不完全です。正しいバージョンは次のとおりです。
from distutils.core import setup
import py2exe
setup(
name = 'handytool',
description = 'Some handy tool',
version = '2.0',
zipfile = 'bin/library.zip',
windows = [{'script': 'handytool.py',
'dest_base': 'bin/handytool'}
],
options = {'py2exe': {'packages':'encodings',
'includes': 'glib, gio, gobject, cairo, atk, pango, pangocairo, gtk'}
}
)
zipfileとdest_baseの値に注意してください。これらのオプションを使用すると、.exe、一連の .pyd ファイル、および library.zip がすべて py2exe の dist/bin ディレクトリに作成されます。次に、GTK+ のディレクトリを py2exe の dist ディレクトリにコピーすると、実行可能ファイルは libgtk-win32-2.0.0.dll などのすぐ隣にあります。上記を行わないと、誤って構成された PATH 環境変数が、py2exe 実行可能ファイルがロードする (互換性のない) .dll ファイルに干渉する可能性があります。
したがって、上記の setup.py ファイルの場合、dist の正しいディレクトリ構造は次のようになります。
bin/handytool.exe
bin/library.zip
bin/*.pyd (all .pyd files py2exe deemed needed)
bin/* (complete copy of GTK+ runtime bin dir)
etc/* (complete copy of GTK+ runtime etc dir)
share/* (complete copy of GTK+ runtime share dir)
lib/* (complete copy of GTK+ runtime lib dir)
上記が正しく機能するようになると、画像の読み込みがうまく機能することがわかり、share/ の一部 (不要/不要な翻訳ファイルなど) を除外することを考え始めることができます。
mvg、ディーター
[1] http://www.py2exe.org/index.cgi/Py2exeAndPyGTK
2011/07/05 編集: PyGObject 2.28/PyGTK 2.24 の includes オプションを修正しました。PyGObject 2.28 のみを使用している場合は、includes オプションに 'glib, gio, gobject' を含める必要があります。PyGTK を使用している場合は、'glib, gio, gobject, cairo, atk, pango, pangocairo, gtk' が必要です。