Pyinstaller打包时包含静态资源


写在前面

最近在做一个项目,交付时使用exe,但是有几个DLL依赖需要放到同级目录,被问及能不能把DLL隐藏起来,之前从没有搞过类似的事情,于是打开百度,搜索一番,还是有戏的。

打包进EXE

Pyinstaller可以使用makespec命令生成spec文件,或者在初次打包时自动生成,此时修改相应的spec文件:

# 以元组的形式写到datas列表里,第一个值为文件路径(使用反斜杠),第二个值为打包后相对exe文件的目录,'.'表示根目录
datas=[('xxx.dll','.'),('xxx.png','.'),('xx.mp3','dll')]

tips:
如果还是不清楚,可以将工程打包为文件夹观察一下。

引用

完成上述工作,你发现并没有什么卵用,mp3和img该出不来的还是出不来。
这就要说到pyinstaller的工作机制,在运行exe时,会先将整个工程解压到Temp中一个文件夹下,自然,你的data也会包含进去
但是通过相对路径引用的资源文件,并不会找到Temp目录去,还是在当前exe的目录下寻找,要解决这个问题,可以参考以下代码:

import os,sys
if getattr(sys, 'frozen', None):
    basedir = sys._MEIPASS
else:
    basedir = os.path.dirname(__file__)
# 这样引用就不会出问题了,也可以print(basedir)看看在哪个目录
FILE_PATH = os.path.join(basedir,'xxx.mp3')

写在后面

感谢CSND,感谢百度,让我解决了问题。