TensorFlow安装异常排查:导入报错与命名空间冲突解决
关于TensorFlow版本冲突与导入异常的问题排查
遇到的问题梳理
- 最初使用TensorFlow 1.7版本时,执行
import tensorflow报错:illegal instruction (core dumped) - 执行
pip3 install --upgrade tensorflow-gpu==1.5.0安装1.5.0 GPU版后,导入不再报错,但调用tf.set_random_seed(random_state)时返回:AttributeError: module 'tensorflow' has no attribute 'set_random_seed' - 在Jupyter Notebook中通过
shift-tab查看库帮助,显示异常信息:Type: module String form: <module 'tensorflow' (namespace)> Docstring: <no docstring> - 执行pip命令查看安装情况:
~ $ pip show tensorflow-gpu Name: tensorflow-gpu Version: 1.5.0 Summary: TensorFlow helps the tensors flow Home-page: https://www.tensorflow.org/ Author: Google Inc. Author-email: opensource@google.com License: Apache 2.0 Location: /home/analyst/anaconda3/lib/python3.6/site-packages Requires: absl-py, wheel, six, tensorflow-tensorboard, numpy, protobuf Required-by: $ pip show tensorflow #Returns nothing
后续发现的异常线索
线索1:疑似存在旧版本文件
搜索到TensorFlow 1.1.0相关文件,担心影响当前版本:
>qqusr@qqusr-PC ~ $ locate -i tensorflow.py /home/qqusr/anaconda3/pkgs/tensorflow-1.1.0-np112py36_0/lib/python3.6/site-packages/tensorflow/python/pywrap_tensorflow.py /home/qqusr/tensorflow/tensorflow/tools/dist_test/scripts/k8s_tensorflow.py
线索2:存在两个活跃命名空间
执行tf.__path__返回两个路径,说明Python导入时同时识别了两个TensorFlow目录:
> tf.__path__ _NamespacePath(['/home/aa/tensorflow', '/home/aa/anaconda3/lib/python3.6/site-packages/tensorflow'])
问题根源与修复方案
核心问题
你的Python环境里存在两个TensorFlow的导入路径:一个是你本地目录/home/aa/tensorflow(应该是之前手动下载或编译的源码目录),另一个是conda环境里通过pip安装的/home/aa/anaconda3/lib/python3.6/site-packages/tensorflow。Python导入模块时会优先搜索当前工作目录或更早出现在sys.path里的路径,导致实际导入的是本地源码目录里的TensorFlow,而不是你通过pip安装的1.5.0 GPU版本——这就是为什么调用tf.set_random_seed()会报错,而且库帮助信息异常。
修复步骤
- 移除本地TensorFlow源码目录的干扰
- 如果你不再需要本地的TensorFlow源码,直接删除
/home/aa/tensorflow目录; - 如果需要保留源码,确保在运行代码时,工作目录不要和这个源码目录重叠,或者临时调整
sys.path,让conda安装的路径排在前面:import sys # 将conda安装的TensorFlow路径插入到sys.path最前面 sys.path.insert(0, '/home/aa/anaconda3/lib/python3.6/site-packages') import tensorflow as tf
- 如果你不再需要本地的TensorFlow源码,直接删除
- 清理残留的旧版本文件
- 对于conda pkgs里的1.1.0版本文件,其实是conda缓存的包,不会直接影响导入,但如果担心可以用
conda clean --packages清理无用的缓存包; - 注意不要手动删除pkgs目录里的文件,避免破坏conda环境。
- 对于conda pkgs里的1.1.0版本文件,其实是conda缓存的包,不会直接影响导入,但如果担心可以用
- 验证修复效果
- 重新打开Python或Jupyter Notebook,执行:
import tensorflow as tf print(tf.__version__) # 应该输出1.5.0 print(tf.__path__) # 应该只显示conda安装的路径 tf.set_random_seed(42) # 此时应该正常执行,不再报错
- 重新打开Python或Jupyter Notebook,执行:
内容的提问来源于stack exchange,提问作者Rocketq
相关产品推荐
相关产品推荐

