py2exe 无法生成可执行文件

py2exe fails to generate an executable

提问人:Charles Anderson 提问时间:11/27/2008 最后编辑:Erik KaplunCharles Anderson 更新时间:2/22/2015 访问量:63099

问:

我在 XP 上使用 python 2.6。我刚刚安装了py2exe,我可以成功地从 hello.py 创建一个简单的hello.exe。但是,当我尝试在我的真实程序上使用 py2exe 时,py2exe 会产生一些信息消息,但无法在 dist 文件夹中生成任何内容。

我的 setup.py 如下所示:

from distutils.core import setup
import py2exe

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

py2exe 输出如下所示:

python setup.py py2exe
running py2exe
creating C:\DevSource\Scripts\ServerManager\build
creating C:\DevSource\Scripts\ServerManager\build\bdist.win32
   ...
   ...
creating C:\DevSource\Scripts\ServerManager\dist
*** searching for required modules ***
*** parsing results ***
creating python loader for extension 'wx._misc_' (C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_misc_.pyd -> wx._misc_.pyd)
creating python loader for extension 'lxml.etree' (C:\Python26\lib\site-packages\lxml\etree.pyd -> lxml.etree.pyd)
   ...
   ...
creating python loader for extension 'bz2' (C:\Python26\DLLs\bz2.pyd -> bz2.pyd)
*** finding dlls needed ***

py2exe 似乎已经找到了我所有的导入(尽管看到提到 win32 我有点惊讶,因为我没有明确导入它)。此外,我的程序使用此命令启动得非常愉快:

python ServerManager.py

显然,我做了一些根本性错误的事情,但是在没有来自py2exe的任何错误消息的情况下,我不知道是什么。

蟒蛇 wxpython py2exe

评论

0赞 Ali Afshar 11/27/2008
如果真的没有更多的输出,来自 py2exe,这是一个非常奇怪的输出。通常它会告诉你为什么会失败。我能说的最好的事情是你有没有通读所有这些:py2exe.org/index.cgi/Py2exeAndwxPython
0赞 Ali Afshar 11/28/2008
查尔斯:我经常检查这个,我对解决方案很感兴趣。如果你想通了,请回帖。谢谢。

答:

1赞 user13876 11/28/2008 #1

输出显示您正在使用 WX。尝试使用指定为 GUI 应用程序而不是控制台的脚本运行 py2exe。如果我没记错的话,这往往会导致 py2exe 出现问题。

评论

0赞 Charles Anderson 11/28/2008
好的,我的 setup.py 现在看起来像这样:从 distutils.core import setup import py2exe setup(windows = [{“script”: 'ServerManager.py'}]) 但这没有效果。但是,我已经设法证明wxPython导致了这个问题。如果我不导入 wx,py2exe 可以完美运行。
0赞 Alex 8/12/2009
下载MSVCR90.DLL并将其复制到 Python26/DLL 对我有用!
41赞 Charles Anderson 11/28/2008 #2

我发现,如果我注释掉使用wxPython的程序部分,py2exe就可以正常工作。此外,当我在下载随附的“简单”示例上使用 py2exe 时(即在 Python26\Lib\site-packages\py2exe\samples\simple 中),我收到以下错误消息:

*** finding dlls needed ***
error: MSVCP90.dll: No such file or directory

因此,关于wxPython的一些事情使py2exe认为我需要Visual Studio 2008 DLL。我没有 VS2008,但我的程序作为 Python 模块目录运行良好。我在网上找到了MSVCP90.DLL的副本,将其安装在 Python26/DLL 中,py2exe 现在可以正常工作。

我仍然不明白这种依赖关系从何而来,因为我可以在没有 py2exe 的情况下完美地运行我的代码。同样令人讨厌的是,py2exe 没有像 test_wx.py 示例那样给我错误消息。

进一步更新:当我尝试在另一台 PC 上运行 py2exe 的输出时,我发现它需要安装 MSVCR90.DLL;因此,如果您的目标 PC 尚未安装 Visual C++ 2008,我建议您下载并安装 Microsoft Visual C++ 2008 Redistributable Package

评论

4赞 kender 3/29/2009
我在使用 PyQt4 应用程序时遇到了同样的问题。下载DLL有帮助,谢谢!
3赞 phkahler 2/16/2010
很好,但是什么导致了这种依赖性?
2赞 exhuma 11/3/2010
MSVCP90.dll也可以在官方Microsoft包(x86)中找到。可能还需要将此包部署到运行此应用程序的所有计算机!
1赞 4/25/2016
@SridharRatnakumar:这不仅不建议从本网站下载随机DLL,而且将其包含在您的软件包中可能会违反许可证。如果你拥有 Visual Studio,则有一个 redist.txt 文件,其中列出了在安装过程中可以重新分发的文件(如果确实需要这样做)。否则,只需使用唯一可靠且经过批准的方法:将vcredist_x86.exe与您的安装捆绑在一起。如果您的安装程序能够在后台运行它,则加分。是的,它使您的包裹更大。但至少我们不再建议人们下载这样的DLL。
1赞 4/25/2016
@CharlesAnderson:同样的话,不要安装(或者更糟的是,重新分发)你“在网络上找到”的DLL。但至少你的最后一句话是对的。
42赞 Bill 4/22/2009 #3

我把它放在我所有的 setup.py 脚本中:

distutils.core.setup(
    options = {
        "py2exe": {
            "dll_excludes": ["MSVCP90.dll"]
        }
    },
    ...
)

这样可以使 py2exe 保持安静,但您仍然需要确保 dll 在用户的计算机上。

评论

5赞 Peter Hansen 6/28/2010
+1:这个答案确实是原始问题的唯一正确答案,该问题报告了使用 py2exe 构建期间的问题。这是非常正确的(正如Charles自己的回答中所指出的),你仍然需要DLL在目标机器上,但假设你已经处理了这个问题,并且你仍然在构建机器上得到这个错误(就像我刚才所做的那样)Bill上面的答案很好地关闭了py2exe并让你的构建完成。
0赞 rectangletangle 2/2/2011
这已经给我带来了一段时间的问题,只是尝试了这个修复程序,它 100% 有效。
-2赞 T. PH. 9/16/2009 #4
import sys

sys.path.append('c:/Program Files/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT')

评论

0赞 Paco 2/11/2015
你能向 OP 解释一下这段代码的作用吗?(编辑您的帖子)。谢谢
6赞 resplin 10/15/2009 #5

看起来这只是 Python 2.6 的依赖项。我在 2.5 下没有收到此错误,但在升级后我收到了。

此电子邮件线程提供了一些背景信息,说明问题存在的原因以及如何解决它:
http://www.nabble.com/py2exe,-Py26,-wxPython-and-dll-td20556399.html

我不想安装 vcredist。我的应用程序目前不需要安装,可以由非管理员运行,这是我不想失去的行为。因此,我按照链接中的建议进行了操作,并通过安装“仅供此用户使用”的Python获得了必要的Microsoft.VC90.CRT.manifest和msvcr90.dll。我还需要msvcp90.dll,我在“所有用户”Python 2.6安装的WinSxS文件夹中找到它。由于我已经拥有了三个中的两个,因此我包含了 msvcm90.dll 以防止将来出现错误,尽管当我将其排除在外时,我没有立即收到任何错误。我将清单和三个 DLL 放在冻结的应用程序使用的 libs 文件夹中。

我必须执行的技巧是在我的应用程序文件夹的根目录中包含清单和 msvcr90.dll 的附加副本,旁边是 py2exe 生成的可执行文件。DLL 的此副本用于引导应用程序,但随后它似乎只在 libs 文件夹中查找。

希望这一发现能帮助其他人。

此外,我在让py2exe记录真正的错误消息时遇到了同样的问题。然后我意识到 stderr 没有被重定向到我的日志文件中。在调用 py2exe 的命令行上添加“> build.log 2>&1”。

评论

1赞 resplin 10/16/2009
正如这个线程中记录的那样:stackoverflow.com/questions/1570542 我的解决方案并不像我想象的那么聪明;它会导致其他错误。我只需要安装 vcredist。精 氨 酸
2赞 William Knight 2/25/2010
我说你还是很聪明的。也许它不适用于使用 SQLite 的应用程序,但我尝试了将 3 个 dll 和清单文件添加到运行时目录的技巧。这使得我相当简单的 Python26/py2exe 应用程序能够正常运行而不会出错,也无需在机器 (Win2003 Server) 上安装 vc_redist,这是我在客户端机器上无法做到的。Werner F. Bruhin 在这里有关于这个简单解决方案的更多细节:sourceforge.net/mailarchive/......
3赞 george 4/13/2010 #6

仅供参考,对我来说,复制文件有效

Microsoft.VC90.CRT.manifest msvcr90.dll

添加到用户计算机上具有 .exe 的目录(未安装 python 或 VC 可再发行组件)。

感谢这里的所有提示!

评论

1赞 alex_jordan 5/22/2013
我只是想说Microsoft.VC90.CRT.manifest名称至关重要。我的清单名为x86_Microsoft.VC90.CRT_1fc8b3b9..._9.0.21022.8_x-ww_d08.....清单,这让我有些头疼,想知道为什么它不起作用。谢谢!
9赞 Mike Driscoll 11/18/2010 #7

wxPython 与它无关。在 Python 2.6 之前,Python 使用 Visual Studio 2003 作为其 Windows 编译器。从 2.6 开始,他们切换到 Visual Studio 2008,在某些情况下需要清单文件。这是有据可查的。请参阅以下链接:

http://wiki.wxpython.org/py2exe

http://py2exe.org/index.cgi/Tutorial#Step52

此外,如果要使用 py2exe 创建 wxPython 应用程序,则需要设置 windows 参数,而不是控制台参数。也许我的教程会帮助你:

http://www.blog.pythonlibrary.org/2010/07/31/a-py2exe-tutorial-build-a-binary-series/

1赞 bazzinga 8/11/2012 #8

试试这个: http://www.py2exe.org/index.cgi/Tutorial#Step52

它对我有用

6赞 Egor 9/25/2012 #9
import sys

sys.path.append('C:\\WINDOWS\\WinSxS\\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2')

在每个 Windows 上,您可以在MSVCP90.dllC:\\WINDOWS\\WinSxS\\

就我而言,目录是:。x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2

转到并使用 Windows 文件搜索查找 .C:\\WINDOWS\\WinSxS\\MSVCP90.dll

-1赞 Werner 2/12/2015 #10

wxPython wiki 上有一些信息。

部署 Python 应用

带有 wxPython 和 Python 2.6 的 py2exe

-1赞 petitchamp 2/22/2015 #11

在我的win8.1上,我找不到路径

c:/Program Files/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT

相反,dll 位于

C:/WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_XXXXXXX

XXX 可能因您的 PC 而异

您可以在路径中搜索,然后在 setup.py 中添加路径

import sys
sys.path.append('C:/WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_XXXXXXX')