使用py2exe打包python脚本(except 2.6)

一、简介

py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序。

py2exe已经被用于创建wxPython,Tkinter,Pmw,PyGTK,pygame,win32com client和server,和其它的独立程序。py2exe是发布在开源许可证下的。

二、安装py2exe

从http://prdownloads.sourceforge.net/py2exe下载并运行与你所安装的Python对应的py2exe版本的 installer,这将安装py2exe和相应的例子;这些例子被安装在lib/site-packages/py2exe/samples目录下。

三、py2exe的用法

如果你有一个名为myscript.py的python脚本,你想把它转换为运行在windows上的可执行程序,并运行在没有安装python的 windows系统上,那么首先你应写一个用于发布程序的设置脚本例如mysetup.py,在其中的setup函数前插入语句import py2exe 。
mysetup.py示例如下:
# mysetup.py
from distutils.core import setup
import py2exe

setup(console=["myscript.py"])
然后按下面的方法运行mysetup.py:
python mysetup.py py2exe
上面的命令执行后将产生一个名为dist的子目录,其中包含了myscript.exe,python24.dll,library.zip这些文件。
如果你的myscript.py脚本中用了已编译的C扩展模块,那么这些模块也会被拷贝在个子目录中,同样,所有的dll文件在运行时都是需要的,除了系统的dll文件。
dist子目录中的文件包含了你的程序所必须的东西,你应将这个子目录中的所有内容一起发布。

默认情况下,py2exe在目录dist下创建以下这些必须的文件:
1、一个或多个exe文件。
2、python##.dll。
3、几个.pyd文件,它们是已编译的扩展名,它们是exe文件所需要的;加上其它的.dll文件,这些.dll是.pyd所需要的。
4、一个library.zip文件,它包含了已编译的纯的python模块如.pyc或.pyo
上面的mysetup.py创建了一个控制台的myscript.exe程序,如果你要创建一个图形用户界的程序,那么你只需要将mysetup.py中的console=["myscript.py"]替换为windows=["myscript.py"]既可。

py2exe一次能够创建多个exe文件,你需要将这些脚本文件的列表传递给console或windows的关键字参数。如果你有几个相关联的脚本,那么这是很有用的。
运行下面个命令,将显示py2exe命令的所有命令行标记。
python mysetup.py py2exe --help

四、指定额外的文件
一些应用程序在运行时需要额外的文件,诸如配置文件、字体、位图。
如果在安装脚本中用data_files可选项指定了那些额外的文件,那么py2exe能将这些文件拷贝到dist子目录中。data_files应包含一个元组(target-dir, files)列表,其中的files是这些额外的文件的列表。
示例如下:
# mysetup.py
from distutils.core import setup
import glob
import py2exe

setup(console=["myscript.py"],
data_files=[("bitmaps",
["bm/large.gif", "bm/small.gif"]),
("fonts",
glob.glob("fonts//*.fnt"))],
)
说明:data_files选项将创建一个子目录dist/bitmaps,其中包含两个.gif文件;一个子目录dist/fonts,其中包含了所有的.fnt文件。

五、Windows NT services

你可以通过传递一个service关键字参数给setup函数来建造Windows NT services
,这个service参数的值必须是一个Python模块名(包含一service类)的列表。
示例如下:
# mysetup.py
from distutils.core import setup
import py2exe

setup(service=["MyService"])
所建造的可执行的service是可以通过在其后跟一定的命令行参数标记来自行安装和卸载的。你可以通过在这个可执行的service(exe)后跟一-help参数来得到更多的帮助。
六、COM servers

你可以通过传递一个com_server 关键字参数给setup函数来建造Windows NT services
,这个service参数的值必须是一个Python模块名(包含一个或多个COM server 类)的列表。
示例如下:
# mysetup.py
from distutils.core import setup
import py2exe

setup(com_server=["win32com.server.interp"])
默认情况下,DLL和EXE servers被建造,你不需要它们的话你可以简单的删除它们。

尽量别使用 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打包python脚本(except 2.6))