2013-11-10 3 views
1

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

Я готовлю яйца на макинтош (10.8.5):

sudo python setup.py bdist_egg 

Я затем скопировать его на машину WinXP (на самом деле она работает на том же compoter как VM) и установить его:

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

Когда я затем попытаться запустить «питон usingTry.py» из питона терминала (на 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 

Кто-то знает, как решить эту проблему ? В этом link является почтовый файл со всем:

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) 

Вы заметите, что папка Попробуйте \ try2 \ try3 (который содержит код яйцеклетки) был вручную скопирован туда, где создается EXE файл (Попробуйте \ пользователи \ usingTry \ расст). Это связано с тем, что файл exe работает. Я нашел это решение в PyInstaller generated exe not working, project uses ReportLab

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

+1

Одна вещь, которую вы можете сделать, которая фактически не решает проблему, включает эти файлы в файлы данных. Он скопирует их для вас в каталог dist /. Скорее всего, вы хотите получить доступ к файлам из яйца, хотя, верно? Это [должно быть возможно] (http://pythonhosted.org/setuptools/pkg_resources.html#resource-extraction), и я помню, что он работал один раз. Если я не опоздаю, дайте мне знать, что я могу вам помочь. – jadkik94

+0

Да, пожалуйста! Я все еще жду, чтобы кто-то помог мне в этом. – yoel

ответ

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 (я сомневаюсь, пип бы сделать это, хотя)
  • корабля яйцо снаружи, и поместить его скажем, ./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, и вы можете найти полезную информацию о том, что включено (или не включено).

+0

Hi jadkik, я хотел бы быстро приговорить к тому, что еще не ответил. Я благодарю вас за вашу помощь и попробую, как только смогу, и напишу. – yoel