py2exe 无法生成可执行文件
我在XP系统上使用的是Python 2.6。我刚安装了py2exe,并且能够成功地从一个hello.py文件创建一个简单的hello.exe。然而,当我尝试在我的真实程序上使用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没有给我任何错误信息,我也不知道问题出在哪里。
11 个回答
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/
我在所有的setup.py脚本里都加上这个:
distutils.core.setup(
options = {
"py2exe": {
"dll_excludes": ["MSVCP90.dll"]
}
},
...
)
这样可以让py2exe保持安静,但你还是需要确保那个dll文件在用户的电脑上。
我发现,如果我把程序中使用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示例中那样给我一个错误提示,这让我有点烦。
进一步更新:当我尝试在另一台电脑上运行py2exe的输出时,我发现需要安装MSVCR90.DLL;所以如果你的目标电脑上没有安装Visual C++ 2008,我建议你下载并安装Microsoft Visual C++ 2008 Redistributable Package。