2013-03-18 11 views
6

Я пытаюсь создать exe из кода python. Я могу запустить код просто отлично из командной строки, как это:py2exe не находит всех зависимостей

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'] 

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

$ ./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 найти зависимости?

Thanks

+1

py2exe немного устарел (последнее изменение было в 2008 году, я думаю?). Я думаю, что [PyInstaller] (http://www.pyinstaller.org/) является активным проектом и имеет гораздо лучшую поддержку. Кроме того, глядя на ваши комментарии к другим ответам, у вас есть модули, установленные на системном уровне, или они локальны для вашего 'myScript.py'? – ernie

+0

Спасибо. Я перешел от py2exe и пытался cx-freeze. Модули устанавливаются в каталоге Python. Я могу импортировать их из оболочки python. Я дам PyInstaller выстрел. –

+0

У вас на самом деле есть «Carbon» и «Carbon.Files», установленные и импортируемые на Windows-машине? – abarnert

ответ

0

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

+1

Может быть, но у меня есть Python 2.7.1 и установлен py2exe-0.6.9.win32-py2.7.exe. Кажется правильным. –

+0

да, извините, я использую ту же самую версию, и она отлично работает. Вы можете попробовать повторно установить его, если вы еще этого не сделали. –

+0

вздох. У меня такая же проблема с cx-freeze, что приводит меня к мысли, что в этом есть что-то, что мешает Python находить зависимости. –

1

Carbon - это имя двух разных особенностей, специфичных для Mac.

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

Во-вторых, как в 2.x, так и 3.x на Mac OS X с PyObjC оболочка PyObjC около Carbon.Framework имеет имя Carbon. (PyObjC не является частью stdlib, но он поставляется с сборками Apple Python и большинством сторонних сборников, помимо официальных установщиков 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 в качестве обходного пути, не беспокоясь о том, почему они ошибочно обнаруживаются.