栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

ubuntu20.04 ROS不能运行(Python版本问题)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ubuntu20.04 ROS不能运行(Python版本问题)

报错

最近在使用ROS noetic时,在正确安装ROS完全版的情况下,仍然无法正常使用,运行roscore,主要报错如下:

❯ roscore
Traceback (most recent call last):
  File "/opt/ros/noetic/bin/roscore", line 37, in 
    from roslaunch.nodeprocess import DEFAULT_TIMEOUT_SIGINT, DEFAULT_TIMEOUT_SIGTERM
  File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/__init__.py", line 57, in 
    from .launch import ROSLaunchRunner
  File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/launch.py", line 58, in 
    from roslaunch.rlutil import update_terminal_name
  File "/opt/ros/noetic/lib/python3/dist-packages/roslaunch/rlutil.py", line 47, in 
    import rosclean
  File "/opt/ros/noetic/lib/python3/dist-packages/rosclean/__init__.py", line 40, in 
    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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938710.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号