обращение к ресурсам яйца python при использовании PyInstaller

Я пытаюсь создать exe-файл с помощью PyInstaller (режим одного файла). Моя программа представляет собой один файл (используяTry.py). Это очень простой файл, который создает экземпляр класса «TrySystem» из файла яйца, который я создал. Класс «TrySystem» загружает файл XRC и помещает в него растровую кнопку с помощью wxPython. XRC и файлы изображений сохраняются как внутренние ресурсы яйца, как описано в Управление ресурсами в проект Python

Я готовлю свое яйцо на Mac (10.8.5):

sudo python setup.py bdist_egg

Затем я копирую его на машину с WinXP (на самом деле он работает на том же компьютере, что и виртуальная машина) и устанавливаю:

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

Когда я затем пытаюсь запустить «python usingTry.py» из терминала Python (в WinXP), все работает нормально, и я вижу рамку и кнопку. Затем я готовлю исполняемый файл из файла «usingTry.py» (в WinXP):

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 (которая содержит код яйца) была вручную скопирована туда, где находится созданный исполняемый файл (Try\users\usingTry\dist). Это потому, что он заставляет exe-файл работать. Я нашел этот обходной путь в сгенерированный PyInstaller exe-файл не работает, проект использует ReportLab

Что я хотел бы сделать, так это избежать этого обходного пути, и все будет просто работать. Это должно быть что-то очень простое, поскольку на веб-сайте PyInstaller заявлено, что они полностью поддерживают использование файлов egg.


person yoel    schedule 10.11.2013    source источник
comment
Одна вещь, которую вы можете сделать, но которая на самом деле не решает проблему, это включить эти файлы в качестве файлов данных. Он скопирует их для вас в каталог dist/. Вы, вероятно, хотите получить доступ к файлам из яйца напрямую, верно? Это должно быть возможно, и я помню, что однажды у меня это сработало. Если я не опоздаю с ответом, дайте мне знать, что я могу вам помочь.   -  person jadkik94    schedule 23.12.2013
comment
Да, пожалуйста! Я все еще жду, чтобы кто-нибудь помог мне с этим.   -  person yoel    schedule 23.12.2013


Ответы (1)


Я думаю, что проблема здесь в том, что когда вы устанавливаете его с помощью 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, и он извлечет их в каталог исполняемого файла. Это то, что я закончил делать раньше.

Извините, если я действительно опоздал :) Надеюсь, это поможет.

редактировать О, и это может помочь вам в отладке, если вы посмотрите на файлы .toc в каталогах сборки. Просто нажмите Ctrl+F для try3 и usingTry, и вы можете найти полезную информацию о том, что включено (или не включено).

person jadkik94    schedule 13.01.2014
comment
Привет, jadkik, я хотел быстро извиниться за то, что еще не ответил. Я очень благодарю вас за вашу помощь и попробую, как только смогу, и отпишусь. - person yoel; 16.01.2014