3

Python3-PyGObject プログラムを pynsist でパッケージ化したいと考えています。リポジトリには PyGTK の例があり、例を変更するのはそれほど難しいことではないと思いました。

例はここにあります:

このファイル ( https://github.com/takluyver/pynsist/blob/master/examples/pygtk/grab_files.sh ) で、GTK 3 ( http://www.gtk.org /ダウンロード/win32.php ):

wget -O gtkbundle.zip http://win32builder.gnome.org/gtk+-bundle_3.6.4-20130921_win32.zip
wget -O pygobject.exe http://sourceforge.net/projects/pygobjectwin32/files/pygi-aio-3.14.0_rev12-setup.exe/download
wget -O pycairo.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/cairo_1.10.2-2_win32.zip

これらのバインディングはすでに gtk または pygobject バンドル内にある必要があるというのが私の現在の理解であるため、4 行目で何をすべきかわかりません。

 wget -O pygtk.exe http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.24/pygtk-2.24.0.win32-py2.7.exe

次に、このファイル ( https://github.com/takluyver/pynsist/blob/master/examples/pygtk/installer.cfg )をカスタマイズして含めようとしました(giの代わりに使用gi.repository):

[Include]
packages=gi

この結果のエラーは次のとおりです。

raise ExtensionModuleMismatch(extensionmod_errmsg % ('Windows', path)) nsist.copymodules.ExtensionModuleMismatch: Found an extension module that will not be usable on Windows: /usr/lib/python3/dist-packages/gi/_gi.cpython-34m-x86_64-linux-gnu.so Put Windows packages in pynsist_pkgs/ to avoid this.

プログラムの正しいアプローチ(たとえば、これらのいずれか: https://python-gtk-3-tutorial.readthedocs.org )が何であるかを知っている人はいますか?

編集 1

プログラムをパッケージ化して Windows にインストールした後、test-program を開始すると、次のトレースバックが生成されます。

Traceback (most recent call last):
  File "C:\Program Files (x86)\hellogtk\hellogtk.launch.pyw", line 31, in <module>
    from gtk_test import main
  File "C:\Program Files (x86)\hellogtk\pkgs\gtk_test.py", line 3, in <module>
    from gi.repository import Gtk
  File "C:\Program Files (x86)\hellogtk\pkgs\gi\__init__.py", line 42, in <module>
    from . import _gi
ImportError: DLL load failed: The specified module could not be found.

_gi.pydと同じディレクトリ ( gi) に-fileがあるために、この ImportError が発生するのは奇妙です。__init__.py

これが現在のレイアウトです。

 - directory
 |- pynsist_pkgs
 |-- cairo
 |--- _cairo.pyd
 |--- __init__.py
 |-- gi
 |--- _gobject
 |--- overrides
 |--- repository
 |--- __init__.py
 |--- _gi.pyd
 |--- ...
 |-- gtk
 |--- bin
 |--- etc
 |--- lib
 |--- manifest
 |--- share
 |-- dbus
 |--- __init__.py
 |--- ...
 |-- gnome
 |--- ...
 |-- pygtkcompat
 |--- ...
 |-- _dbus_bindings.pyd
 |-- _dbus_glib_bindings.pyd
 |-- ...
 |- gtk_test.py
 |- grab_files.sh
 |- installer.cfg
 |- gtk_preamble.py

そしてpy-3.4-64、pygobjectバインディングのフォルダーを使用しました。パッケージを作成している Linux は 64 ビットで、プログラムを実行している Windows も 64 ビットです。

編集2:

Dependency-Walker を使用すると、2 つの DLL が見つからないことがわかります:GPSVC.DLLIESHIMS.DLL.

編集3:

システムでこれらの 2 つの DLL を見つけて、テスト プログラムの別のディレクトリにコピーしましたが、機能しませんでした。

編集4:

これは import-error に役立つかもしれません:

4

1 に答える 1

2

私はこの問題を解決するために、pynsist の著者であるThomas K氏と協力しました。そして、私はそれが非常に優れたサポートを備えた優れたツールであることを宣伝したいと思います。私の意見では、パッケージングが桁違いに簡単になります.

私のアプローチには多くの間違いがあったため (質問を参照)、正しいアプローチを説明する方が簡単かもしれません。

依存関係をダウンロード

インポートのみを行うプログラムに必要な唯一の依存関係:

 from gi.repository import Gtk

は、ここからダウンロードできる最新のpygi-aio(現在のpygi-aio-3.14) バンドルです (pynsist-repository の例にはダウンロード スクリプトがありますが、新しいリリース用に更新する必要がある場合があります)。

依存関係を抽出する

pynsist-repository にマージされた PyGObject/PyGI サンプルには、バンドルから必要な依存関係を抽出するスクリプトが付属しています (参照: https://github.com/takluyver/pynsist/tree/master/examples/pygi_mpl_numpy)。

最も重要なことは、バインディングの zip ファイルの内容を抽出し (対象となる Python のバージョンとビット数に合わせてスクリプトを変更します)、それらを次のpynsist_pkgsフォルダーにコピーすることです。

  - cairo
  - dbus
  - gi
  - gnome
  - pygtkcompat

次に、サブ依存関係を抽出してpynsist_pkgs/gnome/フォルダーにコピーします。lazkaが指摘したように、典型的な最小限の Gtk プログラムの最小要件は次のとおりです (各ライブラリにはzipファイルpygi/noarchpygi/[TargetedArchitecture]zip ファイルがあります)。

 - ATK
 - Base
 - Gdk
 - GDKPixbuf
 - GTK
 - JPEG
 - Pango
 - WebP
 - TIFF

インストーラーをビルドする

私の場合、インストーラーは次を使用してビルドされました。

 python3 -m nsist installer.cfg

これinstaller.cfgは、リポジトリのサンプル フォルダーにもあります。リストするだけgnomeで済みます (gnome フォルダー内のサブ依存関係は 1 つのユニットとして動作します)。

pygi-aio バンドルに関する注意

pygi-aio が Windows マシンにインストールされると、インストーラーはインストール後のコンパイル手順をいくつか実行します。このアプローチを使用している場合、依存関係のみを抽出するため、これが問題になる可能性があります。場合によっては、exe ファイル (バンドルに付属) を実行し、コンパイルされたファイルをビルド ディレクトリにコピーする必要があります。ここで私が抱えていた唯一の問題について説明します。

また、詳細が記載されたバグ レポートがここにあります。

実施例

ここで例を取得できます:

于 2015-04-03T14:08:11.570 に答える