py2exe не находит все зависимости

Я пытаюсь создать exe из кода Python. Я могу просто запустить код из командной строки следующим образом:

python myScript.py

Я установил py2exe отсюда: http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/

И у вас есть setup.py, который выглядит так:

from distutils.core import setup
import py2exe

setup(console=['myScript.py'])

И я запускаю setup.py следующим образом:

python setup.py py2exe

На выходе получаю следующее:

The following modules appear to be missing
['Carbon', 'Carbon.Files', '__pypy__', '_scproxy', 'http_parser.http', 'http_parser.reader', 'jinja2._debugsupport', 'jinja2._markupsafe._speedups',
'jinja2.debugrenderer', 'markupsafe', 'pretty', 'socketpool', 'socketpool.util']

И, конечно же, если я попытаюсь запустить exe, я получаю ошибки:

$ ./myScript.exe
Traceback (most recent call last):
  File "restkit\__init__.pyc", line 9, in <module>
  File "restkit\conn.pyc", line 14, in <module>
ImportError: No module named socketpool
Traceback (most recent call last):
  File "myScript.py", line 12, in <module>
ImportError: cannot import name Resource

Что мне нужно сделать, чтобы py2exe нашел зависимости?

Спасибо


person Doo Dah    schedule 18.03.2013    source источник
comment
py2exe немного устарел (думаю, последнее изменение было в 2008 году?). Я думаю, что PyInstaller — это активный проект, и его поддержка гораздо лучше. Кроме того, глядя на ваши комментарии к другим ответам, установлены ли у вас модули на системном уровне или они локальны для вашего myScript.py?   -  person ernie    schedule 18.03.2013
comment
Спасибо. Я перешел от py2exe и пробовал cx-freeze. Модули устанавливаются в каталог Python. Я могу импортировать их из оболочки Python. Я попробую PyInstaller.   -  person Doo Dah    schedule 18.03.2013
comment
У вас на самом деле установлены Carbon и Carbon.Files, и их можно импортировать на машину с Windows?   -  person abarnert    schedule 18.03.2013
comment
Нет, я не. Я не уверен, почему py2exe считает, что они отсутствуют   -  person Doo Dah    schedule 18.03.2013
comment
Итак, теперь я пытаюсь использовать PyInstaller. Пожалуй, стоит открыть новую тему и закрыть эту. Насколько я знаю, здесь нет решения с py2ex. fwiw, я пробовал с cx-freeze и packages = [restkit, jinja2, restkit.client]. Я также пробовал включать include = [restkit, jinja2, restkit.client]   -  person Doo Dah    schedule 19.03.2013
comment
вы можете сделать то же самое, что вы делали в cxfreeze там в py2exe с опцией include.   -  person trevorKirkby    schedule 05.01.2014


Ответы (2)


Carbon — это название двух разных вещей, характерных для Mac.

Во-первых, в версии 2.x в сборках Mac OS X и Mac Classic есть пакет Carbon. в стандартной библиотеке, используемой для вызова API Carbon/Toolbox (а в OS X — CoreFoundation и других).

Во-вторых, как в 2.x, так и в 3.x, в Mac OS X с PyObjC оболочка PyObjC вокруг Carbon.Framework называется Carbon. (PyObjC не является частью stdlib, но он поставляется со сборками Python от Apple и большинством сторонних сборок, помимо официальных установщиков python.org.)

Ни один из них не будет существовать в Windows.

py2exe старается быть умным и импортирует только то, что имеет отношение к вашей платформе. Однако обмануть довольно легко. Например, что-то вроде этого:

try:
    import Carbon.Files
except:
    Carbon = collections.namedtuple('Carbon', 'Files')
    Carbon.Files = None

if Carbon.Files:
    Carbon.Files.whatever(…)

… может заставить py2exe подумать, что Carbon.Files требуется.

Теперь, очевидно, это не вся ваша проблема, но это очень большой красный флаг, что код зависимости модуля py2exe не работает для вашего проекта. У вас, вероятно, есть аналогичные проблемы со всеми видами других модулей, поэтому он одновременно пропускает некоторые вещи, которые вам нужны, и требует некоторых вещей, которых у вас нет, и это, вероятно, является причиной ваших реальных проблем.

Как объясняется в разделе FAQ, вы можете отладить это, запустив код поиска модулей, чтобы увидеть, где это идет не так, как это:

python -m py2exe.mf -d path/to/my_file.py

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

Или, проще говоря, просто явно включайте и исключайте модули в вашем setup.py в качестве обходного пути, не беспокоясь о том, почему они неправильно обнаруживаются.

person abarnert    schedule 18.03.2013

py2exe зависит от версии Python. Все, что вы делаете, кажется правильным, я предполагаю, что у вас установлена ​​​​неправильная версия.

person Chris Hawkes    schedule 18.03.2013
comment
Может быть, но у меня Python 2.7.1 и установлен py2exe-0.6.9.win32-py2.7.exe. Кажется правильным. - person Doo Dah; 18.03.2013
comment
да, извините, я использую ту же версию, и она работает нормально. Вы можете попробовать переустановить его, если вы еще этого не сделали. - person Chris Hawkes; 18.03.2013
comment
вздох. У меня та же проблема с cx-freeze, что заставляет меня поверить, что в этом есть что-то, что мешает Python найти зависимости. - person Doo Dah; 18.03.2013