尽量别使用 Py2exe for Python 2.6

Py2exe 是用来将 Python 程序打包成 Windows 下可执行 exe 程序的工具。这样那些未安装 Python 开发环境的用户就可以直接使用 Python 写的软件了。

Py2exe 并不是把 Python 程序编译成 Windows 的原生程序,而是将运行 Python 所需的 dll, lib 等打包到一起供 Python 程序使用。一个很短的 Python 程序往往会生成几兆的软件包。因此 Py2exe 打包程序的执行效率并不会有提升,只是方便初级 Windows 用户使用罢了。

除了 Py2exe 之外,还有一些其它的 Python 到 exe 的打包程序,比如 Pyinstaller、cx_Freeze 等。它们在某些情况下表现比 Py2exe 要好,但是在兼容性和用户群支持上不如 Py2exe(一家之见)。

前两天我图新鲜,把 Windows 中的 Python 升级到了 2.6,PyGtk 和 Py2exe 也随之升级到了支持 2.6 的版本。然后问题就来了,用 Py2exe for Python 2.6 打包的 PyGtk 程序在打包的机器上运行正常,但拷贝到部分人的 Windows 中后却无法运行,点击就出现

“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。”

刚开始我以为是 Win 下 GTK 库 dll 的问题,反复地验证几次觉得应该问题不在 GTK 上。如果缺少外部库,Python 应该报缺少 dll 问题,而不是应用程序出错。怀疑是缺少微软的库,用 PE Explorer 试用版在出问题的电脑上扫描一下应用程序的依赖关系,发现缺少 msvcr90.dll,将 msvcr90.dll 拷贝到程序包中,再扫描依赖关系,所有的 dll 已经都满足了,仍然报出同样的错误。

后来基本确定是 Python 2.6 的问题。因为 Python 2.6 是使用 Microsoft Visual C++ 2008 编译的,所以要想 py2exe for 2.6 打包的程序运行,目标机器上必须装有 Python 2.6 或者 Microsoft Visual C++ 2008 Redistributable Package。否则系统就无法识别 exe 程序的 CRT, 因而它就成为无法运行的程序。

之所以程序在一部分人的机器上运行正常,是因为这些人 Windows 中安装了 VC2008 开发套件,自然也就包括了 VC2008 运行时库。

因为我们发布程序时无法强制每个人都去安装 Microsoft Visual C++ 2008 Redistributable Package,所以需要发布 exe 程序时,还是使用老版本的 Python 2.5 和 Py2exe for Python 2.5,别使用 Python 2.6 为好。

《尽量别使用 Py2exe for Python 2.6》上有8条评论

  1. 也发现这个问题了,那不用它还有什么好的可以用呢?

  2. 如果redist 2008没有装的话,就算让用户机器上装Python,不是也照样跑不起来?

  3. 你好,很高兴能和你共同探讨Python的问题。
    在你的建议下,我使用了Python2.5,但是同样发现了相似的问题。
    就是Python2.5同样依赖MS的dll,这次不是msvcr90.dll,而是版本更低的msvcr71.dll。
    Py2exe的2.5版本在生成可执行文件是就自动生成该文件。
    我曾经尝试搜索硬盘里面的msvcr71.dll,发现有十几个--都是其他软件(如ps)带的。然后我把它们都删除(想还原的话可以在回收站还原),结果,python生成的exe文件就运行不了,提示缺少msvcr71.dll。

  4. 顶下~~~你的文章在google结果列表的第三,哈哈,一下帮我解决了问题,谢谢啦~

  5. 之前我也遇到这个问题,后来发现py2exe的网站上有写明需要向终端用户提供哪些ms dll以及如何布局。
    http://www.py2exe.org/index.cgi/Tutorial

    我是看到这么吓人的标题而点进来看的,py2exe和python 2.6+真是冤枉啊
    虽然离博主发表这篇文章已经2年了,也许有点晚,噗。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注