py2exe

将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 是发布在开源许可证下的。

二、安装 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 被建造,你不需要它们的话你可以简单的删除它们。

自己的例子如下:

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)