用 PyInstaller 打包封装python
一、必备环境:安装PyInstaller :
pip install pyinstaller
二、输入数据:
test.py 代码,以及 test.png ,test2.png 用于界面显示到图标文件。
三、期望结果:
输出一个test 可以执行程序文件,可直接运行。如: ./test.
实际上,这个文件可运行程序文件是一个包,运行过程中会将这个包解压缩到/tmp/_MEIxxxxxx 路径下,运行结束会自动清理掉。
四、关键步骤:
1、创建配置文件
pyi-makespec --hidden-import pkgutil -F --add-data test.png:. --add-data test2.png:. --key=xxxxxxx(16个字符长度密码 ) ./test.py
2、修改配置文件
如果在创建配置文件的命令中有些参数没有写,可以去直接去配置文件里面修改。基本上不建议修改,因为配置文件里的路径是绝对路径,维护这个文件不太方便。
3、生成可执行程序包
pyinstaller ./test.spec
五、重点问题:
1、pyi-makespec -F 参数:将可执行程序和依赖库打包成一个文件。
默认PyInstaller会将test.py包成一个 test可执行文件,并将依赖到众多so库一并copy到 “.dist/test/”这个路径下。加上 -F 参数后将在 .dist/test/下面只打包成一个名为test包文件。
2、 --add-data <SRC;DEST or SRC:DEST> 参数:将程序需要的依赖文件一同打包,运行时也会一同解压到/tmp/_MEIxxxxxx/DEST 路径下。
这个参数可以多次使用,如:
--add-data test.png:. --add-data test.png:. --add-data test2.png:.
该参数由一对键值组成,中间用冒号(windows系统环境下用分号)隔开。本例中:test.png是SRC 文件名,“.“ 是DEST路径: 即/tmp/_MEIxxxxxx/./
该参数最终会体现在生成的 test.spec 配置文件中的 datas参数里。
默认: datas=[] , 使用 --add-data后 datas=[('test.png', '.'), ('test2.png', '.') ],
如果需要增加其它文件,也可直接修改datas的值。
3、运行时图标加载识别问题。
假设在test.py 需要调用到test.png作为界面图标,并且在python源代码中 test.png和test.py是放在同一个目录下的, test.py通过 相对路径方式(如:”./test.png" 或"test.png" )是可以正常访问图标文件的。但是按照2中的配置打包后,运行时 test.png和test可执行程序 这两个文件都会copy到/tmp/_MEIxxxxxx/路径下面,此时test可执行程序却无法加载图标。
要解决这个问题,可以在test.py中将访问路径改为绝对路径。具体方法参考了此贴:https://stackoverflow.com/questions/7674790/bundling-data-files-with-pyinstaller-onefile
可以通过如下代码获得test.png的绝对路径。
import sys
import os
def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base_path, relative_path)
在test.py 中可以通过 resource_path("test.png") 这个方式来访问图标文件。
4、加密防止反编译。
主要通过 --key=xxxxxxx(16个字符长度密码 ) 这个参数来实现。
需安装加密包:sudo pip install PyCrypto
详细参数使用可以参考官方说明:https://pyinstaller.readthedocs.io/en/stable/man/pyi-makespec.html