6

我正在尝试从 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 找到依赖项?

谢谢

4

2 回答 2

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,PyObjC 包装器Carbon.Framework被命名为Carbon. (PyObjC 不是标准库的一部分,但它确实随 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模块依赖代码不适用于您的项目。您可能在各种其他模块中遇到类似的问题,因此它既缺少一些您需要的东西,又要求一些您没有的东西,这可能是导致您的实际问题的原因。

正如常见问题解答所解释的,您可以通过运行模块查找器代码来调试它,以查看它出错的地方,如下所示:

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

您可以使用此信息来指导模块查找器代码,或重写您的代码,以免混淆py2exe.

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

于 2013-03-18T18:44:49.953 回答
0

py2exe 依赖于 python 版本。你所做的一切似乎都是正确的,我猜你安装了错误的版本。

于 2013-03-18T15:59:36.727 回答