py2exe 未能找到所有依赖项

6 投票
2 回答
9746 浏览
提问于 2025-04-17 19:31

我正在尝试将Python代码转换成一个可执行文件(exe)。我可以在命令行中像这样顺利运行代码:

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找到依赖项呢?

谢谢

2 个回答

0

py2exe是和Python版本有关的。你做的所有事情看起来都没问题,我猜可能是你安装的版本不对。

1

Carbon 是两个与Mac相关的东西的名字。

首先,在2.x版本中,无论是在Mac OS X还是Mac Classic上,都有一个Carbon,这个包是标准库的一部分,用来调用Carbon/Toolbox的API(在OS X中,还包括CoreFoundation等)。

其次,在2.x和3.x版本的Mac OS X上,使用PyObjC时,Carbon.Framework的PyObjC封装也叫Carbon。虽然PyObjC不是标准库的一部分,但它是苹果版本的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的模块依赖代码在你的项目中没有正常工作。你可能在其他各种模块上也会遇到类似的问题,所以它既缺少你需要的东西,又要求你没有的东西,这可能就是导致你实际问题的原因。

正如常见问题解答所解释的,你可以通过运行模块查找代码来调试这个问题,看看哪里出错了,像这样:

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

你可以利用这些信息来指导模块查找代码,或者重写你的代码,以免让py2exe感到困惑。

或者,更简单的方法是,在你的setup.py中明确地包含和排除模块,作为一种变通办法,而不必担心为什么它们被错误地检测到。

撰写回答