单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!

报错:

FileNotFoundError: [Errno 2] No such file or directory:
‘C:\Users\xxx\AppData\Local\Temp_MEI3455\pyecharts\datasets\map_filename.json’
单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!_第1张图片
运行 main.exe 时找不到 map_filename.json 文件。
先在我们的电脑上找到这个文件,一般在本机 Python 安装目录下:
C:\Users\Administrator\xxx\Lib\site-packages\pyecharts\datasets\map_filename.json

单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!_第2张图片

map_filename.json 就在 pyecharts 目录下,为什么会找不到呢?
因为 pyecharts 没有被打包到 main.exe 中。

原因:

网络上看了很多解答,模棱两可,我这里说明原因。
受益终生的小技巧:
可执行文件运行过程:
main.exe 是可执行文件,在Windows里双击运行时,它就像一个压缩包,需要先解压到用户临时目录。我们需要的 pyecharts 也会解压到这里。
临时目录:C:\Users\Administrator\AppData\Local\Temp\_MEI33343之类的目录(最后一个目录名称会有不同)。
在图中,windows系统为了安全,会改名为:
C:\\Users\\ADMINI~1\\AppData\Local\Temp\_MEI33343
没错,名字不太一样,但它们是同一个目录。

先保留报错窗口,临时目录才会存在,打开这个目录。

临时目录如下,找不到东西,指的就是在这个目录下没找着。
单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!_第3张图片

你发现了吗?临时目录中没有 pyecharts 目录,证明这个目录没有被一起打包过来(或者打包路径错误了)。
我们只要把它加入打包路径就好了。

小技巧:以后遇到类似的运行时找不到文件问题,只要打开临时目录,一目了然。

解决:

1.打包命令解释

我们的打包命令是:
pyinstaller -F -w main.py

pyinstaller 命令运行时会生成并覆盖 main.spec 文件,只要在这里增加打包的文件路径就能够打包到 main.exe 了。

2.添加打包文件路径(小坑)

修改 main.spec 文件中 Analysis 的 datas :
在这里插入图片描述

图中例子包含了整个文件夹的拷贝,请注意看路径最后的部分(双斜杠)。
解压后,

在 datas 中设置元组(A,B):A,要打包的文件目录,B, 解压后该文件存放的目录(以 main.exe 解压目录为根)。

如果不拷贝文件夹而是单独拷贝文件,举例: ('xxx\\a.txt',’.‘),这样 a.txt 就会在 main.exe 解压后根目录下。

千万别写成 ('xxx\\a.txt',’.\\a.txt‘),哒咩哟!那样你会发现 a.txt 竟然变成了文件夹!

3.修改打包命令

修改了 main.spec 文件以后,需要修改打包命令为:

pyinstaller main.spec

不要再用 pyinstaller -F -w main.py 打包了,那样会覆盖掉 main.spec 文件。

结果

打包结果:
仅有一个 exe 可执行文件:
单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!_第4张图片

运行时以迅雷之势打开临时目录可见:
单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!_第5张图片
解压后的目录有了pyecharts,路径自然就对了。
运行ok。

你可能感兴趣的:(python,echarts,html,pyqt)