将Python程序打包成可执行文件 2010-07-13 10:20
Python程序打包为独立的exe lanbing510 于 2014-04-26 16:27:43 发布
Python2: < 0.6.9
Python3: >= 0.9.2
py2exe 是一个将 python 脚本转换成 windows 上的可独立执行的可执行程序 (*.exe) 的工具,这样,你就可以不用装 python 而在 windows 系统上运行这个可执行程序。
py2exe 已经被用于创建 wxPython,Tkinter,Pmw,PyGTK,pygame,win32com client 和 server, 和其它的独立程序。py2exe 是发布在开源许可证下的。
从 http://prdownloads.sourceforge.net/py2exe 下载并运行与你所安装的 Python 对应的 py2exe 版本的 installer,这将安装 py2exe 和相应的例子;这些例子被安装在 lib\site-packages\py2exe\samples 目录下。
如果你有一个名为 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 文件。
你可以通过传递一个 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_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 被建造,你不需要它们的话你可以简单的删除它们。
自己的例子如下:
from distutils.core import setup
import py2exe
includes = ["encodings", "encodings.*"]
#要包含的其它库文件
options = {"py2exe":
{"compressed": 1, #压缩
"optimize": 2,
"ascii": 1,
"includes":includes,
"bundle_files": 1 #所有文件打包成一个exe文件
}
}
setup(
version = "0.1.0",
description = "search file",
name = "search file",
options = options,
zipfile=None, #不生成library.zip文件
windows=[{"script": "MessageBox.py", "icon_resources": [(1, "player.ico")] }]#源文件,程序图标
)
MessageBox.py如下:
import win32api
import win32con
win32api.MessageBox(0,'I'm sucre,'Python',win32con.MB_OK)
进入cmd,来到程序所在目录下输入如下代码:
python setup.py py2exe
目前还有一个问题,当输出的内容为中文时,会出现乱码
补充一下,如果要把 python 编译的所有文件打包到一个 exe 中,就需要在 setup () 这个函数中,要设置 2 个参数:options 中的 bundle_files 和 zipfile。
其中 bundle_files 有效值为:
3 (默认) 不打包。
2 打包,但不打包 Python 解释器。
1 打包,包括 Python 解释器。
example:
options = {"py2exe":{"bundle_files": 1}}
zipfile 的有效值为:
不填 (默认) 生成一个 library.zip 文件
None 把所有东西打包进.exe 文件中
下面是我的一个实例
from distutils.core import setup
import py2exe
import glob
options={"py2exe":{"compressed":1,"optimize":2,"bundle_files":1}}
setup(service=["Zhihuhelp"],options=options,zipfile=None)