打包资源文件如果你的程序中使用到了非 Python 的资源文件,仅使用之前的方式打包,程序会无法读取到这些文件。因为 Pyinstaller 并不会自动的将它们打包进去。但是我们可以通过--add-data 命令或者手动去更改.spec 文件来实现资源文件的打包。话不多说,我们开始实操。
使用--add-data命令pyinstaller -w --add-data 'res:res' --add-data './config.ini:.' main.py
--add-data 后紧跟源目录:目标目录 ,比如:
res:res 表示,将源目录下的📁res 复制到目标目录的📁res;
./config.ini:. 表示将源目录下的📄config.ini 复制到根目录下,. 表示根目录。
修改 Spec 文件打包的时候,程序同路径下会生成一个同名的📄.spec ,这个文件是打包的 “中间文件”,我们可以通过修改这个文件的内容来实现添加资源文件的目的。 Spec文件分析.spec 文件中主要包含4部分:Analysis 、PYZ 、EXE 、COLLECT
· Analysis:这部分包括指定要分析的 Python 脚本、导入模块和数据文件的信息。 · pyz:指定如何捆绑依赖项。可以指定将所有依赖项打包到单个可执行文件中,也可以选择将它们存储在单独的文件夹中。 · exe:这是生成的可执行文件的配置部分,包括可执行文件的名称、图标、命令行选项等. · coll:主要是输出信息.
Spec文件修改想要添加资源文件,需要修改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 来应对各种打包场景了,当然它不仅仅支持这么点点的功能,更多的功能大家就查看官方文档慢慢研究吧。 ![图片](http://image109.360doc.com/DownloadImg/2023/11/0918/275103655_1_20231109062641649.jpeg)
|