如果你的程序中使用到了非 Python 的资源文件,仅使用之前的方式打包,程序会无法读取到这些文件。因为 Pyinstaller 并不会自动的将它们打包进去。但是我们可以通过
--add-data
命令或者手动去更改.spec
文件来实现资源文件的打包。话不多说,我们开始实操。
pyinstaller -w --add-data 'res:res' --add-data './config.ini:.' main.py
--add-data
后紧跟源目录:目标目录
,比如:
res:res
表示,将源目录下的📁res 复制到目标目录的📁res;
./config.ini:.
表示将源目录下的📄config.ini 复制到根目录下,.
表示根目录。
打包的时候,程序同路径下会生成一个同名的📄.spec
,这个文件是打包的 “中间文件”,我们可以通过修改这个文件的内容来实现添加资源文件的目的。
.spec
文件中主要包含4部分:Analysis
、PYZ
、EXE
、COLLECT
· Analysis:这部分包括指定要分析的 Python 脚本、导入模块和数据文件的信息。
· pyz:指定如何捆绑依赖项。可以指定将所有依赖项打包到单个可执行文件中,也可以选择将它们存储在单独的文件夹中。
· exe:这是生成的可执行文件的配置部分,包括可执行文件的名称、图标、命令行选项等.
· coll:主要是输出信息.
想要添加资源文件,需要修改Analysis
中datas
数组的内容,默认一般是空的:
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
......
datas=[],
......
)
datas
里边的元素是以元组的形式来存储的,有这么一个映射关系:
datas = [('源文件路径','目标路径')]
如果有多个文件需要拷贝到程序中,就多写几个元组,记得映射关系不要搞错.
📗有一点比较特殊:如果目标路径是打包后的根目录,那就写.
。
在修改完.Spec
文件后,重新运行打包命令即可。
pyinstaller -D xx.spec
不过后边的对象不再是xx.py
文件,而是xx.spec
文件。
本代码使用到了PySimpleGUI
库,需要先安装该库,安装命令 pip install pysimplegui
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :test.py
@说明 :使用Pysimplegui实现一个简单的窗口,并加载 icon.png 图片
@时间 :2023/10/13 09:44:46
@作者 :aliha
@版本 :1.0
'''
import PySimpleGUI as sg
layout = [
[sg.Image('./ico.png')], # 加载根目录下的图片
[sg.Submit('确认'), sg.Cancel('取消')]
]
window = sg.Window('Demo示例', layout)
event, values = window.read()
项目目录结构如下:
├── 🖼️icon.png
└── 📄test.py
先运行之前的打包命令,为了生成.Spec
文件
pyinstaller test.py
修改.Spec
文件,实现将icon.png
打包进去
# ...省略部分代码
datas = [('./icon.png','.')]
# ...省略部分代码
('./ico.png','.')
表示将ico.png
复制到打包目录的根目录下(.
表示根目录)
运行打包命令:
pyinstaller -D test.spec
📁dist 目录结构如下:
├── 📁_internal
| ├── 此处省略很多文件
| └── 🖼️icon.png
└── 📄test.exe
📢:因为最新版本的 Pyinstaller 改变了打包的目录结构,将可执行文件(exe)和其他文件分离了,所以目录结构变成了如上的样子。
至此,我们基本就能够使用 Pyinstaller 来应对各种打包场景了,当然它不仅仅支持这么点点的功能,更多的功能大家就查看官方文档慢慢研究吧。
联系客服