pyinstaller模块用于将python项目打包发布成exe文件,以方便地在没有安装python环境的机器上运行。该模块使用 pip install pyinstaller 安装即可。
参数 | 执行命令 | 含义 |
---|---|---|
-D |
pyinstaller -D demo.py |
默认选项。除了主程序demo.exe外,还会在在dist文件夹中生成很多依赖文件,推荐使用。 |
-c |
pyinstaller -c demo.py |
默认选项。使用控制台,只对windows有效。 |
-F |
pyinstaller -F demo.py |
只在dist文件夹中生成一个程序demo.exe文件,适用于没有多依赖.py文件的单个文件。 |
-w |
pyinstaller -w demo.py |
不使用控制台,只对windows有效。 |
-p |
pyinstaller -p D:\project\demo.py |
设置导入路径。 |
-i |
pyinstaller -i D:\icons\demo.ico demo.py |
给生成的demo.exe文件设置一个自定义的图标。 |
对一个简单.py文件,当没有依赖的其他路径下的.py文件、没有间接依赖的其他包、没有依赖的资源文件时,可使用命令pyinstaller –F xxx.py,直接打包成一个exe文件。
示例:一个简单的整数求和小程序
1) 命名calculator.py,写入内容
if __name__ == '__main__':
print("求和小程序")
a = input("请输入第一个数:")
b = input("请输入第二个数:")
print()
c = int(a) + int(b)
print("两数之和为:", c)
input()
2) 使用命令pyinstaller -c –F calculator.py直接打包。执行完毕后,程序目录下生成了build、dist两个文件夹和一个calculator.spec文件。生成的exe文件即存在于dist文件夹中。
——dist文件夹,发布目录,存放打包后的exe文件;
——build文件夹,存放一些中间过程文件,可忽略;
——.spec文件,即配置文件,用于打包复杂的python项目。
3) 双击calculator.exe,启动运行
实际的项目往往是复杂的,或有许多依赖的其他路径下的.py文件,或有许多间接依赖的包,或有许多涉及的资源文件,因此,需要通过spec配置文件进行打包发布。
由spec配置文件打包发布完毕后,必定会在dist中生成一个文件夹,里面不只有生成的exe文件,还有许多其他的依赖文件。此模式下,通常使用命令 pyinstaller –D xxx.spec 进行发布。
基本步骤:
s1.生成spec文件:执行命令 pyi-makespec main.py ,执行后生成main.spec文件(main.py是项目启动的入口文件);
s2.完善spec文件中的内容
1) Analysis的第一个列表:填入需要打包的.py文件路径,以字符串形式作为列表元素填入。
注:a.填的路径是绝对路径,目录使用双反斜杠避开转义符;
b.打包操作实质上就是将这些文件直接复制到生成的包中。
2) Analysis的datas列表:填入需要打包的非.py类型资源文件,以元组形式作为列表元素填入,路径写至最后一个目录层级。
注:a.填的路径是绝对路径,目录使用双反斜杠避开转义符;
b.打包操作实质上就是将这些文件复制到生成的包中。
3) Analysis的hiddenimports列表:填入需要直接或间接依赖的一系列包名。
猜测:在pyinstaller打包的过程中,实际上可以包含程序直接依赖的包,但无法包含间接依赖的包,因此需要在hiddenimports列表中配置导入。
写法示例
a = Analysis(['test.py',
'D:\\deploy\\a.py',
'D:\\deploy\\b.py',
'D:\\deploy\\c.py'],
pathex=['D:\\PycharmProjects\\Test'],
binaries=[],
datas=[('D:\\deploy\\resourceA','resourceA'),
('D:\\deploy\\resourceB','resourceB')],
hiddenimports=['pandas','cython', 'sklearn','sklearn.metrics',
'sklearn.metrics.get_scorer','sklearn.metrics.cluster',
'sklearn.ensemble','sklearn.neighbors.typedefs','sklearn.neighbors.quad_tree',
'sklearn.tree._utils','scipy._lib.messagestream','email.mime.message',
'email.mime.image', 'email.mime.multipart', 'email.mime.audio', 'email.mime.text',
'sklearn.neighbors._typedefs','sklearn.utils._weight_vector','sklearn.neighbors._quad_tree',
'win32timezone'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
s3.打包发布
执行命令 pyinstaller –D main.py,dist目录下的main文件夹即发布生成的项目文件。
1.当双击exe文件无法看到错误信息时,可尝试通过cmd进入对应目录后命令运行:xxx.exe
2.对于hiddenimports里面不知道具体依赖的包有哪些,一个笨办法是,在cmd下执行xxx.exe,根据提示的错误信息,逐一加上缺失的包。
3.杀毒软件可能会干预,最好打包发布前退出杀毒软件。
参考