pyinstaller打包多个py文件(附带资源和文件路径说明)
1.新建虚拟环境
新建一个虚拟环境可以有效减少最后生成的exe文件的大小。
conda create -name ev1 python=3.9
将项目的依赖重新更改为新建的虚拟环境,将所需要的依赖项全部安装好就可以了。这样这个新环境就不会有其他的额外依赖,环境所占用的空间就比较少了。
2.安装pyinstaller
激活虚拟环境
activate t1
pip安装
pip install pyinstaller
3.进入到项目文件夹,编辑打包文件
移动到D盘cd /d d: 或者直接输入 d:
cd 项目的绝对路径(不同盘符)/相对路径
生成spec文件,这个文件是用来配置打包信息的。默认会在项目文件夹中生成这个文件,可以使用记事本打开编辑。
pyi-makespec -F SpeakerRecog.pyw
-F将项目打包成一个独立的exe文件,SpeakerRecog.pyw项目的主入口
我的项目结构大致如图
我的spec文件录入情况
4.资源路径适配
由于打包之后的资源会被释放到系统中的临时文件夹中,并且每次的文件夹名称会不一样,所以只能调用函数去读取;另外如果把打包文件发送给其他人,路径也会发生变化。基于以上原因路径只能调用函数读取。
获取资源路径具体如下(打包后的和开发环境):
def resource_path():
if getattr(sys, 'frozen', False): # 判断是否为打包环境
base_path = sys._MEIPASS # 获取临时解压目录:一般为C:\Users\qq979\AppData\Local\Temp\_MEI23962\项目名;_MEI23962是变化量}
else:
base_path = os.path.abspath(".") # 开发环境使用当前目录,绝对路径
return base_path
注意事项1:在开发环境中引用的所有资源需要全部使用os.path.join()方式拼接,os.path.join()会自动的匹配当前系统使用的路径分隔符,一定要避免使用路径分隔符(\ 或者/),不然打包之后的资源路径会有问题。
bg = tk.PhotoImage(file=os.path.join(resource_path(),'interface','picture','bg.gif') )
#带有format的也需要改
file_path = os.path.join(resource_path(), 'interface', '{}.jpg').format(number)
注意事项2:打包资源只会帮你拷贝非空文件夹,如果程序中需要使用一些空文件夹,需要在使用之间使用代码创建,否则就会出现开发环境正常,打包之后空文件夹不存在。
# 定义文件夹路径
import os
folder_path1 = os.path.join(resource_path(),'guess','wav','wa')
# 如果文件夹不存在,则在当前项目目录下创建文件夹guess/wav/wa
if not os.path.exists(folder_path1):
os.makedirs(folder_path1)
注意事项3:os.path.join()使用细节
#项目中要使用某个文件夹中的资源,一般是guess/wav/
f1 = os.path.join(resource_path(), 'guess', 'wav')#guess/wav
f2 = os.path.join(resource_path(), 'guess', 'wav', '')#后面跟空字符就会补全系统路径分隔符guess/wav/
5.正式打包
直接打包刚刚的spec文件即可。打包会需要一些时间,打包完毕之后,默认会在项目的目录中生成一个dist文件夹,打开里面就只有一个exe文件,直接双击运行就好了。
pyinstaller SpeakerRecog.spec
打包后的图标更改、文件保存位置、是否需要隐藏dos窗口等配置参考其他资料。