最近在使用ROS noetic时,在正确安装ROS完全版的情况下,仍然无法正常使用,运行roscore,主要报错如下:
❯ roscore
Traceback (most recent call last):
File "/opt/ros/noetic/bin/roscore", line 37, in <module>
from roslaunch.nodeprocess import DEFAULT_TIMEOUT_SIGINT, DEFAULT_TIMEOUT_SIGTERM
File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/__init__.py", line 57, in <module>
from .launch import ROSLaunchRunner
File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/launch.py", line 58, in <module>
from roslaunch.rlutil import update_terminal_name
File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/rlutil.py", line 47, in <module>
import rosclean
File "/opt/ros/noetic/lib/python3/dist-packages/rosclean/__init__.py", line 40, in <module>
from distutils.spawn import find_executable
ModuleNotFoundError: No module named 'distutils.spawn'
显示是python的问题,按照网上的办法,安装distutils
:
sudo apt-get install python3-distutils
安装成功后,但仍然报错。通过查找,发现它安装在了/usr/lib/python3/dist-packages/
目录下,并不是/opt/ros/noetic/lib/python3/dist-packages
,但我们在导入模块的时候,python会在指定的路径下搜索相对应的.py文件,搜索路径存放在sys模块的sys.path
变量中:
按照上面的命令获取python的搜索路径,显然
/usr/lib/python3/dist-packages/
是在其中,那为什么ROS的相关包搜索不到呢?
查了大量的解决方案,常见的解决是修改默认python,修改软链接,通过下列命令查询python默认版本
python --version
说明默认使用的python是3.6,这个在安装系统时自带了,但是通过上面的查询,我之前是安装了python3.8,但
/usr/lib/python3/dist-packages/
下面的包只有3.8可以调用(经过反复验证得出),很奇怪。
那就按照网上的办法更改软链接:
update-alternatives # 列出python替代版本信息
但可能报错,表示Python的替代尚未被 update-alternatives 命令识别,这时候我们需要更新一下替代列表:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 2
–install 选项使用了多个参数用于创建符号链接。最后一个参数指定了此选项的优先级,如果我们没有手动来设置替代选项,那么具有最高优先级的选项就会被选中。这个例子中,我们为 /usr/bin/python3.8 设置的优先级为2
,所以update-alternatives 命令会自动将它设置为默认 Python 版本。
可以通过
sudo update-alternatives --config python
来手动修改优先级。再次输入python
,查看当前python版本:
成功修改为3.8。运行roscore,结果仍然报错。。。没有解决。
后来经过一番努力,发现我默认使用的python3版本是3.6:
原来上面的修改是修改了Python的默认版本为3.8,这里的python是可以包括python2.x和python3.x的。
但是python3的默认版本还是系统自带的3.6,而ROS noetic版本默认采用的是python3,因此实际还是调用python3.6
,所以按照上面的方法设置优先级:
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
或者通过
sudo update-alternatives --config python3
来手动修改优先级。
这样,再输入python3
,默认就是3.8了:
再输入roscore,没有问题,输入小乌龟的demo也没问题:
roslaunch turtle_tf turtle_tf_demo.launch
要修改python3的默认版本,sudo update-alternatives --config python
是不行的,需要sudo update-alternatives --config python3
。