解决方法:pyinstaller打包缺文件

No such file or directory: 'c:xxxx\jieba\dict.txt’

由于接入了jieba库,因为该库里面用到了一些默认的资源文件如 dict.txt idx.txt 等,

这个疑问参考issue 文献3 ,但是解决方案治标不治本,另外还有很多资源文件都无法加载 如:wordcloud 中就加载了默认的 stopword 停用词字典。

因为在pyinstaller 打包后的exe 运行时会在 C:\Users\Administrator\AppData\Local\Temp 新增了一个临时文件夹如“_MEIxxxxxx” 所有py代码都会在临时存放在这里,

所以很多第三方库中如果使用了 file 如下示例:(wordcloud源码)

FILE = os.path.dirname(file)

FONT_PATH = os.environ.get(‘FONT_PATH’, os.path.join(FILE, ‘DroidSansMono.ttf’))
STOPWORDS = set(map(str.strip, open(os.path.join(FILE, ‘stopwords’)).readlines()))
jieba库也有类似加载方式。

会导致运行时__file__ 指向了上面说的临时文件夹“_MEIxxxxxx”,所以就会报错,说找不到该文件,无法打开。

一劳永逸的办法是修改 spec 文件.

先把一些需要加载的资源按照第三方库默认的文件结构放在 static(这个名字随你定) 文件夹内 ,如下图

解决方法:pyinstaller打包缺文件_第1张图片

然后根据官方文档参考文献4,修改spec的datas 节点
解决方法:pyinstaller打包缺文件_第2张图片

datas接收一个元组数组 [(x1,y2),(x2,y2)] x1 是指需要打包的资源文件位置,可以是文件夹名称(我这里是static),单一文件,或者 带有通配符 * 的多个文件。 y1,是指需要输出到临时文件夹内的相对地址。这里我用了 点符号,代表临时文件夹本身。

这样需要的资源文件就包括进去了,也能正常读取了。

有其他办法是修改源码的,其实是很不优雅的。

你可能感兴趣的:(问题解决方案)