问题:anaconda3利用pyinstaller打包.py为.exe文件报如下错误:
(base) D:\>pyinstaller -c -F .\test.py
The 'pathlib' package is an obsolete backport of a standard library package and is incompatible with PyInstaller. Please remove this package (located in D:\anaconda3\Lib\site-packages) using
conda remove
then try again.
找了一些解决方案要conda remove pathlib,如下:
https://blog.csdn.net/m0_45295337/article/details/131034052
https://blog.csdn.net/m0_69311549/article/details/130145253
尴尬的是anaconda navigator也跟着remove了。
解决:找了个更好的解决方法是建个虚拟环境,在虚拟环境下就没有这个问题了(特别注意虚拟环境也得安装pyinstaller)。
另记录下anaconda3使用Pyinstaller打包.py为.exe文件时,通过--add-data添加打包资源文件后,.py代码中的路径要进行转换处理。
如打包成exe命令并添加file文件夹下所有文件: pyinstaller -c -F .\test.py --add-data=".\\file\\*;.\\file"
.py代码中的路径要进行转换处理才能使用打包的资源文件,路径转换方式如下:
#生成资源文件目录访问路径
def resource_path(self, relative_path):
if getattr(sys, 'frozen', False): #是否Bundle Resource
base_path = sys._MEIPASS
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
def get_resource_path(self, relative_path):
# 如果打包资源文件则要路径转换
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
else:
return os.path.join(os.path.abspath("."), relative_path)
再记录下在虚拟环境打包有个好处,就是打包的exe在本机能通过cmd能运行的话(如果运行不了可以及时调试找齐缺少的文件就行),复制到其它电脑或服务器大概率也能正常运行,避免因打包缺少文件闪退的问题。