报错:

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 一次搞定!-LMLPHP
pyecharts 打包成 exe 的时候找不到 map_filename.json 文件。先找到这个文件,一般在本机 Python 安装目录下:
C:\Users\Administrator\xxx\Lib\site-packages\pyecharts\datasets\map_filename.json
单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!-LMLPHP

显然,在 site-packages 目录下的东东,属于第三方库 pyecharts 所有。

原因:

网络上看了很多解答,模棱两可,我这里会说明原因。
首先,生成结果 main.exe(假设是这个名字吧),在Windows里运行起来,其实是先解压 main.exe 到用户临时目录。也就是报错中的:C:\Users\Administrator\AppData\Local\Temp\_MEI33343之类的目录(最后一个目录名称会有不同)。对应图中C:\\Users\\ADMINI~1\\AppData\Local\Temp\_MEI33343,没错,名字不太一样.
先保留报错窗口,这个临时目录才会存在,打开这个目录。
目录下是 main.exe 解压后所有的东西。如果找不到,说明里面没有,或者路径不对。如果没有,就加进来,如果路径不对,就改路径。
单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!-LMLPHP
你发现了吗?临时目录中只有 datasets目录,而图中报错的是 …\pyecharts\datasets\… 显然按照后面这个路径是找不到文件的。

解决:

1.打包命令解释

我们的打包命令是:
pyinstaller -F -w main.py
pyinstaller 命令运行时会生成并覆盖 main.spec 文件,我们只要修改这个配置文件,增加打包的文件路径就行了。

2.添加打包文件路径

修改 main.spec 文件中 Analysis 的 datas :
单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!-LMLPHP
图中例子包含了整个文件夹的拷贝,请注意看路径最后的部分(双斜杠)。
解压后,

在 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 -F -w main.py 打包了,那样会覆盖掉 main.spec 文件。

结果

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

运行时以迅雷之势打开临时目录可见:
单独生成 main.exe, pyinstaller × pyecharts 打包报错找不到文件 map_filename.json 一次搞定!-LMLPHP
解压后的目录有了,东西也在里头,自然也就没问题了。
运行ok。

06-25 20:15