简介

py2exe就是将python代码打包成windows可执行程序的一个python开源项目。
官方网站:http://www.py2exe.org/
下载地址:http://sourceforge.net/projects/py2exe/files/

经典代码

代码1:setup.py

执行方式:

1
python setup.py

代码内容:
1
2
3
4
5
6
from distutils.core import setup
import py2exe
import sys

sys.argv.append('py2exe')
setup(console=["yourcode.py"])

代码2:setup.py

执行方式:

1
python setup.py

代码内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from distutils.core import setup
import py2exe
import sys

#this allows to run it with a simple double click.
sys.argv.append('py2exe')

py2exe_options = {
"includes": ["sip"],
"dll_excludes": ["MSVCP90.dll",],
"compressed": 1,
"optimize": 2,
"ascii": 0,
"bundle_files": 1,
}

setup(
name = 'PyQt Demo',
version = '1.0',
windows = [{ "script":'wordreplace.py',"icon_resources":[(1,"myico.ico")]}],
zipfile = None,
options = {'py2exe': py2exe_options}
)

代码注释

  1. sys.argv.append(‘py2exe’)一行,是允许程序通过双击的形式执行。

  2. 选项中“includes”是需要包含的文件,这里的”sip”是PyQt程序打包时需要添加的,如果不是PyQt程序不需要此项。

  3. “dll_excludes”是需要排除的dll文件,这里的”MSVCP90.dll”文件,如果不排除的话会报error: MSVCP90.dll: No such file or directory错误。

  4. “compressed”为1,则压缩文件

  5. “optimize”为优化级别,默认为0。

  6. “ascii”指不自动包含encodings和codecs。

  7. “myico.ico”是程序图标

  8. bundle_files”是指将程序打包成单文件(此时除了exe文件外,还会生成一个zip文件。如果不需要zip文件,还需要设置zipfile = None)。
    1表示pyd和dll文件会被打包到单文件中,且不能从文件系统中加载python模块;值为
    2表示pyd和dll文件会被打包到单文件中,但是可以从文件系统中加载python模块。
    64位的Py2exe不要添加本句。

  9. windows = [‘pyqtdemo.py’,],这里使用的是windows,即没有命令行窗口出现,如果使用console则表示有命令行窗口出现。

  10. 执行该文件,会得到一个build文件夹和一个dist文件夹。其中,dist文件夹,就是你得到的打包程序。

  11. 如果按照上述代码执行成功,则应该dist文件夹中,只包括程序的exe文件和w9xpopen.exe。w9xpopen.exe是针对windows9x版本的,一般来说该文件并不需要。
    如果bundle_files不为1、2,则dist文件夹中还会包括一些dll文件和pyd文件(Python Dll文件)。如果bundle_files为2,dist文件夹会包括一个python##.dll文件,如果为1则不会。
    如果没有使用zipfile=None,还会生成一个library.zip文件。

常见的问题

  1. 打包后的exe不可执行,是由于缺少两个必要的文件,msvcr90.dll和Microsoft.VC90.CRT.manifest,其中msvcr90.dll的版本为9.0.21022.8,详细解释见官网,
    解决方法:将上述两个文件copy进dist文件夹,或者见官网的解决方式(在打包前,将这两个文件作为资源,直接复制到dist文件夹下)。

  2. 打包后的exe报错,说缺少文件,这个问题的主要原因是python代码import文件时,使用了某些模块提供的所谓lazy import,使得打包时,py2exe找不到类库真正的路径
    解决方法:重新import类库文件的真实路径,然后重新打包,问题解决。

  3. 需要打包一些系统dll,有时候,我们想要将一些dll打包进exe里面,就需要修改py2exe的默认配置,详见官网。

参考链接:http://www.pythoner.com/111.html