PyInstaller打包TensorFlow/Keras项目遇astor VERSION文件缺失错误
我之前打包老版本TensorFlow项目时也遇到过一模一样的问题,这本质是PyInstaller的打包机制没识别到astor库依赖的非代码资源文件导致的。源码运行正常是因为Python能直接访问site-packages里完整的astor目录结构,而打包后只有被PyInstaller判定为“必要”的文件才会被复制到临时运行目录。
下面是几个可行的解决办法:
方法1:通过命令行参数直接添加资源文件
找到你Python环境中astor库的安装目录(一般在Lib\site-packages\astor下),找到里面的VERSION文件,然后用PyInstaller的--add-data参数指定要打包这个文件:
pyinstaller --add-data "C:\Program Files\Python37\Lib\site-packages\astor\VERSION;astor/" your_main_script.py
注意:Windows系统下路径分隔用
;,如果是类Unix系统用:;后面的astor/是打包后文件存放的相对目录,要和astor库的导入路径对应。
方法2:修改PyInstaller的spec文件
如果已经生成过spec文件(运行pyinstaller your_script.py后会自动生成),可以直接编辑spec文件中的datas列表,添加VERSION文件的映射:
a = Analysis( ['your_main_script.py'], pathex=[], binaries=[], # 在这里添加datas条目 datas=[('C:\Program Files\Python37\Lib\site-packages\astor\VERSION', 'astor')], ... )
修改完后,用spec文件重新打包:
pyinstaller your_script.spec
方法3:动态获取astor路径(更通用)
如果不想硬编码路径,可以用pkg_resources动态获取astor的安装位置,适合多人协作或不同环境的情况:
import pkg_resources import os # 获取astor的安装根目录 astor_root = pkg_resources.get_distribution('astor').location # 拼接VERSION文件的完整路径 version_file_path = os.path.join(astor_root, 'astor', 'VERSION')
然后把这个路径代入到--add-data参数中,或者在生成spec文件时自动填充datas。
另外,建议检查下你的astor版本是否和TensorFlow 1.15兼容,一般tf1.15对应的astor版本在0.8.x左右,用pip show astor可以查看当前版本,版本不兼容也可能引发奇怪的问题。
内容的提问来源于stack exchange,提问作者Mudit Rastogi

