PyInstaller python 打包工具使用

PyInstaller python 打包工具使用

参数

参数名 描述 说明
-D 生成one-folder的程序(默认) 生成结果是一个目录,各种第三方依赖、资源和exe同时存储在该目录
-F 生成one-file的程序 生成结果是一个exe文件,所有的第三方依赖、资源和代码均被打包进该exe内
–add-data 打包额外资源 用法:pyinstaller main.py --add-data=src;dest。windows以;分割,macOS/linux以:分割
-c 显示命令行窗口 与-w相反,默认含有此参数
-w 不显示命令行窗口 编写GUI程序时使用此参数有用。
-i 为main.exe指定图标 用法:pyinstaller -i beauty.ico main.py

具体参数看:https://blog.csdn.net/weixin_39000819/article/details/80942423

打包图片等资源

即使使用了–add-data参数也大概率还是会出现图片文件没有找到的情况。

因为当app运行的时候,会先把资源解压到一个系统的临时目录,包括打包进去的 img文件等。但是,此时的代码并不能直接通过 “img/texture.png” 这样的相对路径来得到文件,应该是因为本身程序就不在这里,所以自然引用不到。

这时需要用到 sys 的一个半私有的属性 sys._MEIPASS,根据官方的说明,它是 pyinstaller 运行时创建的临时目录的绝对路径。需要在程序运行时判断当前是不是有这个属性,如果有的话,使用生成临时目录下图片的绝对路径,如果没有的话,那就直接返回当前程序的绝对路径:

1
2
3
4
5
def get_resource_path(relative_path):
# 资源路径拼接当前运行时临时目录路径
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)

每次用到图片资源地址的时候都调用get_resource_path

1
2
texture_filename = get_resource_path("img/texture.png")
texture = cv2.imread(texture_filename)

之后就可以使用下面的命令(windows要将:改成;

1
$ pyinstaller --add-data img:img -wF img2sketch.py

disk目录下生成可执行文件


PyInstaller python 打包工具使用
https://wangyinan.cn/PyInstaller-python-打包工具使用
作者
yinan
发布于
2023年5月22日
许可协议