简介
pyinstaller是一款非常好用的专门针对python程序的打包库,可以利用其方便地对python程序进行打包,然后分享给他人使用。
使用
-F:打包 Python 程序为单个可执行文件
-D:打包 Python 程序为一个文件夹
-i:生成图标,只适用于 Windows 平台
-n:指定打包后生成文件的名称
-w:禁止命令行弹出
常用使用示例:
pyinstaller -F xxx.py
pyinstaller -D xxx.py
pyinstaller -i xxx.ico -n xxx -w -D xxx.py
注意:
- -i 参数后接 .ico 结尾的图标文件。
- -D 或 -F 后接 python 程序的主程序,也就是常见的 main.py。
- 对于依赖比较多的程序,建议使用 -D。
- 对于单文件的 py 脚本,建议使用-F。
基本原理
打包时,pyinstaller 此时会生成相应的 spec 文件,大体流程如下:
- 在脚本目录生成 xxx.spec 文件 (取决于 -n 参数,没传,则与 xxx.py 同名为 xxx);
- 创建一个 build 目录;
- 写入一些日志文件和中间流程文件到 build 目录;
- 创建 dist 目录;
- 生成可执行文件或文件夹到 dist 目录;
此时,进入 dist 目录就可以看见自己的打包文件了,在这里,我使用的是-F的方式进行打包。
双击exe程序即可看到运行结果如下图:
注意事项
Pyinstaller 是跨平台的,但并不是指其生成应用是跨平台的,而是 Pyinstaller 本身是跨平台的,在 Windows 平台下,可以打包出 exe 文件。
避免打包后,包文件过大
为了避免 Pyinstaller 打包后程序或文件夹过大,如:几百 KB 的程序打包后编程 500M 左右的程序,在引用包时,尽量使用 from ... import ... 语句,这是因为 Pyinstaller 打包的路径其实是将 python 解释器以及项目中使用的库直接复制过来,所以如果你没事就别 import... ,那么 Pyinstaller 会将整个模块复制过去,此时打出来的包就会很大。
考虑路径问题
使用 python 时,要养成使用 os.path.join 的习惯,这不仅可以避免跨平台的路径坑 (windows 路径表达与类 Unix 是不同),又可以在打包时不会出现相对路径的问题,很多 python 程序员编写路径喜欢使用 + 号来链接路径,这会增加项目的维护成本。
外部数据问题
使用外部数据时,可以自定义 spec 文件中的 datas 字段,具体流程如下所示:
- 生成spec文件
pyi-makespec test.py
- 修改test.spec
block_cipher = None
a = Analysis(['test.py'],
pathex=['/home/lixin/test'],
binaries=[],
datas=[('test.txt','.')], ## ---- 修改此处添加外部文件
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='test',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
- 打包
pyinstaller test.spec
但我更常用的做法是直接将数据复制过去,不去修改 datas,比如我的项目中依赖 config 文件夹下的配置文件,执行将 config 文件夹整体直接复制到打包好的文件夹中则可。
闪屏结束
如果是简单的程序,可能会出现运行可执行程序后出现一闪而过的情况,这种情况下要么是程序运行结束(比如直接打印的 helloWorld),要么程序出现错误退出了。
这种情况有如下几种解决方式:一是可以通过 input () 函数捕捉输入自己主动结束程序;二是可以在 cmd 下运行 exe 文件,从而通过 cmd 看到效果;三是可以在程序中加入如下代码:
import os
你的代码
os.system("pause")
参考资料
[1] https://mp.weixin.qq.com/s?src=11×tamp=1570861550&ver=1907&signature=q3H3jIxqsiRbS8BuZuCPzyFMQipG9xW6U0dRQ2iezAKUmALjci5iA2IbHT7FPZS-tvgEFdj2bjiHojx8HqHeFKrFGg036dQmxZ9elIo3Zj8xAyyd6UC0EkLihN88&new=1
[2] https://blog.csdn.net/m0_37477175/article/details/82146996