Ubuntu+ROS-noetic+vscode+anacoda+tensorflow python解释器路径矛盾与解决措施
起因:本人系统Ubuntu20.04,用anacoda搭建pyhon3虚拟环境进行ros+tensorflow2.4.0GPU强化学习机器人导航仿真,在运行的过程中出现以下问题:
AttributeError: 'google.protobuf.pyext._message.RepeatedCompositeCo' object has no attribute 'append'
错误出发点
首先我认为是tensorflow与protobuf的版本冲突,这里我查看的当前的prorobuf版本为3.19.4:
- 参照网上关于protobuf版本问题的解决方案为:安装protobuf最新版本3.9.2,于是我尝试在tensorflow虚拟环境中卸载原有版本更新最新版本,此处省略其过程,发现问题依然存在!
- 但考虑到我此时原来的protobuf为安装tensorflow时自动安装的附加的依赖库,其版本应该没有问题,于是我猜测不是版本问题,可能是环境问题,于是我分别切换到base环境和重新新建的环境python3.9或者python3.7查看protobuf版本:
发现不管是原python环境和conda虚拟环境下protobuf都为相同的版本,可见:
并不是protobuf版本的问题!
错误源头
我尝试的查看python文件的路径,通过sys.path打印当前python文件的路径:
按理来说我的PYTHONPATH不应该包含/usr/local/及其/usr/lib下的python解释器,而应该是我的/anacoda/env/下的python解释器路经,随后我用print(os.sys.executable)
打印我的解释器具,果然:
调用了我原python文件的解释器!!!
现在问题看似简单了:更换解释器!!!
解决方案
说到更换python解释器,我起初觉得问题就很简单:在vscode下从右下角或左下角更换解释器
更换到我的tensorflow环境,为了保险起见我同样在我的python前面指定解析路径:
`#! /home/zyl/anaconda3/envs/tensorflow/lib/python3.8
`
本以为问题应该被解决了,但运行之后依然报错:
AttributeError: 'google.protobuf.pyext._message.RepeatedCompositeCo' object has no attribute 'append'
查看打印解释器:依然为/usr/local下的python解释器!!
再次我不得不从头开始研究这个问题。
最终解决方案
想起我运行这个python脚本并非直接运行,而是通过rosrun
指令,可能我刚才的路进设置完全不适用,于是我想到是否是编译过程中的解释器已经被指定?
我找到当前工作空间/bulid/CMakeCache.txt
文件查看编译细节,发现编译过程中已经制定解释器了,因此我在vscode中的设置并没有被执行
所以:
我的解决方案是新建工作空间,重头编译:
新建工作空间->catkin_make->复制功能包->catkin_make
这样,重新查看编译过程:
解释器已经定位到我的虚拟环境下,执行程序,成功!!!!!!