【问题标题】:py2exe doesn't find all dependenciespy2exe 找不到所有依赖项
【发布时间】:2013-03-18 15:43:01
【问题描述】:

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

谢谢

【问题讨论】:

  • py2exe 有点过时了(我认为最后一次更改是在 2008 年?)。我认为PyInstaller 是一个活跃的项目,并且有更好的支持。另外,查看您的 cmets 到其他答案,您是否在系统级别安装了模块,或者它们是您的 myScript.py 本地的?
  • 谢谢。我已经从 py2exe 继续前进,并且一直在尝试 cx-freeze。这些模块安装在 Python 目录中。我可以从 python shell 很好地导入它们。我会给 PyInstaller 一个机会。
  • 您实际上已经在 Windows 机器上安装并导入了 Carbon 和 Carbon.Files?
  • 没有。我不。我不确定为什么 py2exe 认为它们丢失了
  • 好的,现在我正在尝试使用 PyInstaller。也许我应该打开一个新线程并关闭它。 AFAIK,这里没有使用 py2ex 的解决方案。 fwiw,我尝试使用 cx-freeze 和 packages = [“restkit”、“jinja2”、“restkit.client”]。我也试过 include = ["restkit", "jinja2" , "restkit.client" ]

标签: python py2exe cx-freeze


【解决方案1】:

Carbon 是两个不同的 Mac 特定事物的名称。

首先,在 2.x 中,在 Mac OS X 和 Mac Classic 构建中,标准库中有一个 Carbon package,用于调用 Carbon/Toolbox API(以及,在 OS X 中,CoreFoundation 和朋友)。

其次,在 2.x 和 3.x 中,在 Mac OS X 上,使用 PyObjC,Carbon.Framework 周围的 PyObjC 包装器被命名为 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 的模块依赖代码不适用于您的项目,这是一个很大的危险信号。您可能在各种其他模块中遇到类似的问题,因此它既缺少一些您需要的东西,又要求一些您没有的东西,这可能是导致您实际问题的原因。

正如FAQ 解释的那样,您可以通过运行模块查找器代码来调试它,看看哪里出了问题,如下所示:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 可能是,但是,我有 Python 2.7.1 并安装了 py2exe-0.6.9.win32-py2.7.exe。似乎是正确的。
    • 是的,对不起,我使用了相同的版本,它运行良好。如果您还没有这样做,您可能想尝试重新安装它。
    • 叹息。我在使用 cx-freeze 时遇到了同样的问题,这让我相信这会阻止 Python 找到依赖项。
    猜你喜欢
    • 2013-03-07
    • 2021-08-03
    • 1970-01-01
    • 2021-01-21
    • 2017-04-11
    • 2016-10-01
    • 2019-10-28
    • 2020-04-18
    • 1970-01-01
    相关资源
    最近更新 更多