打包程序中包含pyecharts库,使用命令$ pyinstaller -F -w test.py 进行打包时可以正常生成.exe程序,但执行时报错:Failed to execute script 'test' due to unhandled exception: [Errno 2] No such file or diectory: 'C:\\Users\\...\\Temp\\_MEI104722\\pyecharts\\datasets\\map_filename.json'
即:程序无法执行,没有以下文件或文件夹。
查看相关目录,发现_MEI104722是一个临时文件夹,在程序执行时生成,但未生成子文件夹pyecharts,导致文件缺失;
搜索本机文件发现:pyecharts\datasets\map_filename.json在pyecharts库的安装目录下,猜测是pyinstaller打包程序时没有将pyecharts库中的所有的数据打包,使得程序在执行时无法生成需要的临时文件;
方法一:
参照:https://blog.csdn.net/weixin_42272874/article/details/122985608 作者给出了携库打包的方法,及在打包命令中加入添加库的参数--add-data="库安装目录;pyecharts",假如你的python环境中pyecharts库安装目录为:C:\swinstall\Anaconda\envs\centermap\Lib\site-packages,则打包命令应为$pyinstaller --add-data="C:\swinstall\Anaconda\envs\centermap\Lib\site-packages\pyecharts;pyecharts" -F -w test.py;至此便得到可发布和独立运行的.exe程序。
使用pyinstaller打包,如果程序包含外部资源,则需要在打包时注明添加这些外部资源,将其与源码及依赖一起打包到.exe程序中;
注释:pyinstaller --add-data="源地址;目标地址" xx.py。windows以;分割,linux以:分割,即将源地址数据打包到目标地址处。
更多内容请阅读: https://blog.csdn.net/weixin_42272874/article/details/122985608
方法二:
使用命令$pyinstaller -D -w test.py 时,会在dist目录下生成test目录,test.exe在些文件夹下,运行些程序,报错为:xxx\dist\test\pyecharts\datasets\map_filename.json文件缺失,即,在生成的dist\test文件夹下缺少pyecharts\datasets\map_filename.json文件,查看test发现下没有pyecharts文件夹,根据前期推测,将pyecharts库安装目录中的pyecharts文件夹拷贝至test文件夹下,运行程序,程序正常执行。
思考:对比$pyinstaller -F xx.py 与 $pyinstaller -D xx.py两种程序发布方式,使用-F会生成整体的.exe程序,程序执行时会将所需要的数据放入生成的临时文件夹中,执行后销毁临时文件,这种方式有助于掩盖程序的内部信息,但不利于程序的调试、修改;使用-D会生成与程序同名的文件夹xx,文件夹内包含了.exe程序以及程序执行所需要的库与数据,此时,程序执行时无需生成临时文件夹存放所需的数据,只需要直接从xx文件夹下读取,所报错也更加直观,便于调试、修改;故:建议在调试程序时先以$pyinstaller -D xx.py尝试,在确定发布的.exe程序可以正常执行后,再使用$pyinstaller -F xx.py发布单一.exe程序,用于分享移植。
关于pyinstaller更深的思考可以看看:Python 如何打包pyechart?_huhu1986的博客-CSDN博客