1

PyInstaller (1 ファイル モード) で exe ファイルを作成しようとしています。私のプログラムは単一のファイルです (Try.py を使用)。私が作成したeggファイルから「TrySystem」というクラスをインスタンス化する超シンプルなファイルです。「TrySystem」クラスは XRC ファイルをロードし、wxPython を使用してビットマップ ボタンを配置します。Python プロジェクトでのリソースの管理で説明されているように、XRC と画像ファイルは内部の卵リソースとして保存されます。

Mac(10.8.5)で卵を準備します:

sudo python setup.py bdist_egg

次に、それを winXP マシン (実際には VM と同じコンピューター上で実行されます) にコピーしてインストールします。

easy_install Try\try2\dist\try3-1.0-py2.7.egg

次に、Python ターミナル (WinXP 上) から「python usingTry.py」を実行しようとすると、すべて正常に動作し、フレームとボタンが表示されます。次に、「usingTry.py」(WinXP の場合) から exe ファイルを準備します。

Try\users\usingTry>pyinstaller.py -F usingTry.py

そして、私はそれを実行しようとします:

Try\users\usingTry>dist\usingTry.exe

Traceback (most recent call last):
  File "<string>", line 11, in <module>
  File "<string>", line 4, in __init__
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\try3", line 35, in __init__
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\try3", line 8, in __init__
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\wx._core", line 7981, in __init__
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\wx._core", line 7555, in _BootstrapApp
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\try3", line 14, in OnInit
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\pkg_resources", line 868, in resource_filename
  File "z:\Documents\workspace\python\Try\users\usingTry\build\pyi.win32\usingTry\out00-PYZ.pyz\pkg_resources", line 181, in get_provider
  File "c:\programs\pyinstaller-2.0\PyInstaller\loader\iu.py", line 409, in importHook
    raise ImportError("No module named %s" % fqname)
ImportError: No module named try3.resources

誰かがこれを解決する方法を知っていますか? このリンクには、すべてを含む zip ファイルがあります。

try.zip:
    Try/
        try2/                           (this is the code that creates the egg)
            setup.py
            ez_setup.py
            try3/                       (the egg's code)
                __init__.py
                resources/              (here are the resource files used in the egg)
                    __init__.py
                    main.xrc
                    stopButton.png
            build/   
                ...                     (files created while I built the egg)
            dist/
                try3-1.0-py2.7.egg      (the prepared egg file)
            try3.egg-info/
                ...
        users/
            usingTry/                   (here is the code that uses the egg file)
                usingTry.py
                usingTry.spec
                dist/                   
                    usingTry.exe        (created by "pyinstaller -F usingTry.py")                   
                    try3/               (I manually copied it here from Try/try2/ so the exe file works)
                build/                  (created by PyInstaller)
                    ...
                logdict2.7.5.final.0-1  (created by PyInstaller)

Try\try2\try3 フォルダー (卵のコードを含む) が、作成された exe ファイルがある場所 (Try\users\usingTry\dist) に手動でコピーされていることがわかります。これは、exeファイルを機能させるためです。PyInstaller で生成された exeでこの回避策が機能しないことがわかりました。プロジェクトは ReportLab を使用します。

私がやりたいのは、この回避策を避けて、物事がうまくいくことです。卵ファイルの使用を完全にサポートすることが PyInstaller Web サイトで宣言されているため、非常に単純なものでなければなりません。

4

1 に答える 1

0

ここでの問題は、easy_install を使用してインストールすると、圧縮された卵としてインストールされない可能性があることだと思います。これを Linux システムで試してみたところ、そのようになりました。

easy_install --record INSTALLED_FILES.txt try3-1.0-py2.7.eggすると、インストールされたファイルのリストが に表示されますINSTALLED_FILES.txt

そこにリストされているファイルが圧縮された卵にない場合、何が起こっているのかというと、PyInstaller があなたがしたいことを検出しimport try3、それを解凍した卵として見つけ、PYTHONPATH卵ではなく独自の形式でそれを含めます。したがってpkg_resources、卵や「物理」ファイルとしてそれを見つけることができず、壊れます。

おそらくできることは次のとおりです。

  • pipまたはを使用して圧縮された卵としてインストールしてみてくださいeasy_install(ただし、pipがそれを行うとは思えません)
  • 卵を外部に出荷し、たとえば に入れ./eggs、スクリプトから Python パスを変更してすべての卵を含めます。(import glob, sys, os; sys.path.extend(glob.glob(os.path.join(os.path.dirname(sys.executable), 'eggs', '*.egg')))おそらくそのようなもの)実行時に卵を動的に含めたい場合は、私がしたことを知っています)
  • 仕様ファイルから、卵を明示的に含めます。しかしtry3、競合が発生する可能性があります。に卵を追加するpathex=[..., '/full/path/to/try3-1.0-py2.7.egg'と、卵が直接使用され、おそらくそこから直接パッケージ化されます。
  • 最後に、これらのデータ ファイルをAnalysisのデータ リストに追加すると、実行可能ファイルのディレクトリに抽出されます。それが私が以前にやったことです。

本当に遅れてすみません:)それが役に立てば幸いです。

edit.tocああ、ビルドディレクトリのファイルを見るとデバッグに役立つかもしれません。try3およびの Ctrl+F だけでusingTry、何が含まれているか (または含まれていないか) に関する役立つ情報が見つかる場合があります。

于 2014-01-13T23:41:51.017 に答える