PyInstaller打包TensorFlow应用运行时出现tensorflow.contrib懒加载错误
解决PyInstaller打包TensorFlow应用时缺失
tensorflow.contrib的问题 我之前打包依赖TensorFlow的Python程序时也踩过这个坑!PyInstaller的静态代码分析没法识别TensorFlow这种用懒加载实现的模块导入,所以才会在运行exe时抛出ImportError: No module named 'tensorflow.contrib'的错误。给你几个亲测有效的解决办法:
显式导入模块:在你的主脚本(比如
face_classify.py)的开头,直接加上对tensorflow.contrib的导入语句,比如:import tensorflow.contrib # 如果知道具体用到的子模块,也可以更精准地导入,比如用到layers的话: # import tensorflow.contrib.layers这样PyInstaller在静态分析时就能捕捉到这个依赖,自动把contrib模块打包进去。
用
--hidden-import参数手动指定:打包的时候直接在命令行里告诉PyInstaller要包含这个隐藏的依赖:pyinstaller --hidden-import tensorflow.contrib face_classify.py要是还有其他懒加载的子模块没被识别,继续追加
--hidden-import就行,比如--hidden-import tensorflow.contrib.layers。修改.spec文件(适合复杂项目):如果已经生成了
.spec文件,打开它找到hiddenimports列表,把tensorflow.contrib加进去:a = Analysis( ['face_classify.py'], pathex=[], binaries=[], datas=[], hiddenimports=['tensorflow.contrib', 'tensorflow.contrib.layers'], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, )然后用
pyinstaller face_classify.spec重新打包就行。
本质原因就是PyInstaller只会扫描代码里直接的import语句,而TensorFlow用__getattr__实现的懒加载属于动态导入,不在它的扫描范围内,所以必须手动帮它补上这个依赖。
内容的提问来源于stack exchange,提问作者Tasos
相关产品推荐
相关产品推荐

