用py2exe打包python程序成windows程序(打包成单一文件)
简介
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
6from 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
24from 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}
)
代码注释
sys.argv.append(‘py2exe’)一行,是允许程序通过双击的形式执行。
选项中“includes”是需要包含的文件,这里的”sip”是PyQt程序打包时需要添加的,如果不是PyQt程序不需要此项。
“dll_excludes”是需要排除的dll文件,这里的”MSVCP90.dll”文件,如果不排除的话会报error: MSVCP90.dll: No such file or directory错误。
“compressed”为1,则压缩文件
“optimize”为优化级别,默认为0。
“ascii”指不自动包含encodings和codecs。
“myico.ico”是程序图标
bundle_files”是指将程序打包成单文件(此时除了exe文件外,还会生成一个zip文件。如果不需要zip文件,还需要设置zipfile = None)。
1表示pyd和dll文件会被打包到单文件中,且不能从文件系统中加载python模块;值为
2表示pyd和dll文件会被打包到单文件中,但是可以从文件系统中加载python模块。
64位的Py2exe不要添加本句。windows = [‘pyqtdemo.py’,],这里使用的是windows,即没有命令行窗口出现,如果使用console则表示有命令行窗口出现。
执行该文件,会得到一个build文件夹和一个dist文件夹。其中,dist文件夹,就是你得到的打包程序。
如果按照上述代码执行成功,则应该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文件。
常见的问题
打包后的exe不可执行,是由于缺少两个必要的文件,msvcr90.dll和Microsoft.VC90.CRT.manifest,其中msvcr90.dll的版本为9.0.21022.8,详细解释见官网,
解决方法:将上述两个文件copy进dist文件夹,或者见官网的解决方式(在打包前,将这两个文件作为资源,直接复制到dist文件夹下)。打包后的exe报错,说缺少文件,这个问题的主要原因是python代码import文件时,使用了某些模块提供的所谓lazy import,使得打包时,py2exe找不到类库真正的路径
解决方法:重新import类库文件的真实路径,然后重新打包,问题解决。需要打包一些系统dll,有时候,我们想要将一些dll打包进exe里面,就需要修改py2exe的默认配置,详见官网。