本文将会整合出作者在实战过程中遇到的Pyinstaller打包出错的解决方法,解决方法不唯一,本文只会说名我的解决方法。

  • WordCloud
  • jieba
  • xpinyin

WordCloud

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

当第三方库使用了__file__如下所示:

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”,所以就会报错,说找不到该文件,无法打开。

这边我的解决方法是将stopwords文件直接放到项目文件夹根目录(stopwords文件在wordcloud根目录)

如下图,在项目文件夹创建一个resources文件夹并将stopwords文件放进去:

然后更改源代码(wordcloud.py)的文件指向:

try语句块里为修改后的代码,使用try是因为在更改路径后未打包的状态下直接运行还是会报错,所以需要写回源来的代码保证平常写代码的时候不会报错
FONT_PATH = os.environ.get('FONT_PATH', os.path.join(os.path.dirname(sys.executable), 'DroidSansMono.ttf'))
STOPWORDS = set([x.strip() for x in open(os.path.join(os.path.dirname(sys.executable),'./resources/stopwords')).read().split("\n")])

更改后便不再报错

jieba

jieba库也同样是__file__指向了临时文件夹“_MEIxxxxxx”的问题

方案一:

只需要将jieba根目录下的dict.txt文件放入打包文件中:

当打包的时候使用--add-data字段将dict.txt一并打包即可(打包完成后可删除dict.txt文件)

pyinstaller -F main.py --add-data dict.txt;.\jieba -w

方案二:

将结巴

只需要将jieba根目录下的dict.txt文件放入打包文件中(看方案一)

并在代码中直接引用即可(打包完成后不可删除dict.txt文件)

import jieba

jieba.set_dictionary("./dict.txt") # 指定dict.txt加载路径
jieba.initialize()                 # jieba库初始化

更改后便不再报错

xpinyin

打包xpinyin报错找不到Mandarin.dat,需要更改源代码,找到源文件__init__并更改如下内容:

data_path = Path(__file__).resolve().with_name('Mandarin.dat') # 原来的代码
data_path=Path('./resources').resolve().joinpath('Mandarin.dat') # 更改后的代码

上面将源代码里面的__file__更改未我们指定的相对路径./resources文件夹,所以我们需要手动将xpinyin根目录下的Mandarin.dat复制到我们的项目中:

打包后需要保留Mandarin.dat文件

更改后便不再报错

参考网址:

解决方法:pyinstaller打包缺文件_zw05011的博客-CSDN博客

使用jieba分词+PyInstaller进行打包时出现的问题_jieba 中encoding报错_AllenLink的博客-CSDN博客

解决Pyinstaller打包xpinyin报错找不到mandarin.dat_pyinstaller打包之后少.dat文件_小白救小白的博客-CSDN博客


佛系更新,更有可能不更新!