51

我在 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 的任何错误消息的情况下,我不知道是什么。

4

11 回答 11

42

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

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

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

于 2009-04-21T21:29:58.143 回答
40

我发现如果我注释掉程序中使用 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/DLLs 中,py2exe 现在可以正常工作了。

我仍然不明白这种依赖是从哪里来的,因为我可以在没有 py2exe 的情况下完美地运行我的代码。py2exe 没有像 test_wx.py 样本那样给我一个错误消息,这也很烦人。

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

于 2008-11-28T10:36:56.880 回答
9

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/

于 2010-11-18T15:07:21.433 回答
6

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

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

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

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

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

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

于 2009-10-15T03:37:08.327 回答
6
import sys

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

在每个 Windows 上,您都可以MSVCP90.dll在以下子目录中找到该文件C:\\WINDOWS\\WinSxS\\

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

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

于 2012-09-25T06:37:18.497 回答
3

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

Microsoft.VC90.CRT.manifest msvcr90.dll

进入用户机器上带有 .exe 的目录(没有安装 python 或 VC 可再发行组件)。

感谢这里的所有提示!

于 2010-04-13T14:43:32.273 回答
1

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

于 2008-11-28T06:05:46.443 回答
1

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

它对我有用

于 2012-08-10T17:38:41.350 回答
-1

wxPython wiki 上有一些信息。

部署 Python 应用程序

py2exe 与 wxPython 和 Python 2.6

于 2015-02-12T09:35:53.790 回答
-1

在我的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 可能因您的电脑而异

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

import sys
sys.path.append('C:/WINDOWS/WinSxS/x86_Microsoft.VC90.CRT_XXXXXXX')
于 2015-02-21T21:20:54.607 回答
-2
import sys

sys.path.append('c:/Program Files/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT')
于 2009-09-16T15:58:53.823 回答