ros系统里Python版本问题

由于ros系统里一些包需要高版本的Python,所以现在在系统里有2.7、3.8、3.6版本的Python。现在roslaunch一些文件时会报如下的错。

Error in sitecustomize; set PYTHONVERBOSE for traceback:
NameError: name 'reload' is not defined
Traceback (most recent call last):
  File "/usr/local/bin/rosversion", line 4, in 
    import re
  File "/usr/lib/python3.8/re.py", line 143, in 
    class RegexFlag(enum.IntFlag):
AttributeError: module 'enum' has no attribute 'IntFlag'
RLException: Invalid <param> tag: Cannot load command parameter [rosversion]: command [['rosversion', 'roslaunch']] returned with code [1]. 
Param xml is <param command="rosversion roslaunch" name="rosversion"/>
The traceback for the exception was written to the log file

看了一些帖子,每个人的情况不一样,不敢乱模仿,希望大家给支支招,谢谢大家!

  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:ros的python文件使用./运行后报错
  • 除此之外, 这篇博客: ROS Python 入门学习笔记--1--工作空间与功能包的创建中的 二、创建功能包 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 功能包是存放在 WORKSPACE下的src目录内的,所以创建功能包要先进入src目录。

    cd ~/WORKSPACE_NAME/src
    catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

    创建完成后,会到工作空间根目录,执行一次:

    catkin_make

    之后老规矩,配置一次环境变量(如果已经修改了.bashsr文件则可以忽略) 

    source ~/WORKSPACE_NAME/devel/setup.bash

    至此创建功能包的大体步骤就完成了,编写的cpp源码可以放到pkg下src目录,但是,请记住,我们的标题叫:ROS Python入门学习笔记,所以我主要想和大家分享一下如何使用Python来编写我们的ROS。

            与Cpp文件不同,Python文件需要放置在pkg下 新建一个scripts文件夹下。并且,我们还需要在该文件夹下执行一句:

    chomd a+x xxx.py

    因为默认编写的py文件是不具备执行权限的,我们要运行它必须要使用:python xxx.py 

    输入这样一句命令行,就赋予了py文件的可执行性。

            至此,本节基本结束,与其它教程不同的是,为避免重复造轮子,本讲未介绍文件目录下各个文件夹的功能,大家可以自行查阅CSDN的相关内容。

我引用ChatGPT作答:这个错误的原因是,您的ROS系统正在使用Python 3.8版本,但您在使用旧版的代码或包,这些包需要较早版本的Python(如2.7或3.6)。这导致了一些兼容性问题,如您所见的错误。

要解决这个问题,您需要确保您的ROS系统与所有使用的包都使用相同的Python版本。您可以通过以下方法之一来解决此问题:

1.更新您的包以使用与ROS系统相同的Python版本。
2.将ROS系统切换到与您的包使用的Python版本相同的版本。
3.使用virtualenv或conda等工具为每个ROS工作区创建一个独立的Python环境,以便在其中安装需要的Python版本和软件包。

如果您使用的是Ubuntu操作系统,可以使用以下命令来切换ROS使用的Python版本:

sudo update-alternatives --config python

这将列出可用的Python版本,并允许您选择要在ROS中使用的版本。

这是由于多个版本之间冲突的问题,如果你只需要一个版本,其它的版本删除掉即可,如果需要保留,那你每次使用需要切换到一个版本,你可以打开终端,输入python即可查看默认的版本,然后使用 update-alternatives 来为整个系统更改Python 版本,当时需要哪个版本的时候,切换以下即可。update-alternatives 的具体操作,你参考这位大神的:https://blog.csdn.net/weixin_43142797/article/details/98117240

该回答参考ChatGPT:
这个问题是因为Python 3.6不支持enum.IntFlag,而你的Python版本中同时包含了3.6和3.8两个版本,导致程序在运行时使用了3.6版本的Python,出现了错误。

解决方法是指定程序使用Python 3.8版本。可以使用以下命令运行程序:

python3.8 your_program.py
其中,your_program.py是你要运行的Python脚本文件。这样就可以确保程序使用Python 3.8版本运行,避免出现版本兼容性问题。

如果你需要在系统中默认使用Python 3.8版本,可以将Python 3.8的路径添加到PATH环境变量中,或者将/usr/bin/python3软链接到Python 3.8的可执行文件。具体操作可以参考相关教程或文档。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,出现这个问题的原因是因为你的Python环境中有多个版本,并且ROS使用的Python版本与你的默认Python版本不一致。可以尝试以下几个步骤:

  1. 首先设置你的默认Python版本为ROS所需版本,可以使用以下命令:
$ echo "alias python=python3.6" >> ~/.bashrc
$ source ~/.bashrc

其中 python3.6 指的是ROS所需的Python版本。

  1. 接着,需要重新构建ROS环境,以确保ROS环境使用正确的Python版本。可以使用以下命令:
$ catkin_make clean
$ catkin_make
$ source devel/setup.bash
  1. 如果问题仍然存在,可以尝试手动设置Python版本,可以使用以下命令:
$ export PYTHONPATH=/opt/ros/kinetic/lib/python2.7/dist-packages:/opt/ros/kinetic/lib/python2.7/site-packages:$PYTHONPATH

其中 /opt/ros/kinetic/lib/python2.7/ 指的是ROS中使用的Python路径,如果ROS的版本不是kinetic,则需要相应调整路径。

  1. 最后,如果还遇到问题,可以尝试重新安装ROS,确保安装过程中使用正确的Python版本。

希望以上方法对你有帮助。
如果我的回答解决了您的问题,请采纳!

该回答引用ChatGPT
这个错误提示表明在运行rosversion命令时出现了问题,可能是由于Python版本不兼容导致的。具体来说,Python 3.8中的enum模块没有IntFlag属性,而rosversion命令需要使用这个属性。因此,我们需要将Python版本切换到兼容的版本。
首先,我们可以使用以下命令查看当前系统中可用的Python版本:

ls /usr/bin/python*

然后,我们可以使用以下命令将默认Python版本更改为兼容的版本(例如Python 3.6):

sudo update-alternatives --config python

在选择Python版本时,选择兼容的版本即可。然后,我们可以重新运行roslaunch命令,看看是否仍然出现错误。
如果仍然出现错误,我们可以尝试在终端中手动运行rosversion命令,看看是否出现相同的错误。如果是,我们可以尝试使用以下命令重新安装ros-core:

sudo apt-get install --reinstall ros--ros-core

其中,应替换为您正在使用的ROS发行版(例如melodic)。
如果仍然出现错误,我们可以尝试在终端中手动运行Python脚本,看看是否出现相同的错误。如果是,我们可以尝试使用以下命令重新安装Python:

sudo apt-get install --reinstall python3

如果仍然出现错误,我们可以尝试使用以下命令重新安装enum模块:

sudo apt-get install python3-enum

希望这些方法能够帮助您解决问题。

引用chatGPT作答,根据你提供的信息,错误信息中出现了Python版本不兼容的问题。具体来说,roslaunch尝试使用Python 3.8的标准库中的枚举(enum)模块,但是Python 3.6中的enum模块并没有IntFlag属性,导致运行时出现AttributeError异常。此外,错误信息中还包含了一个NameError异常,说明在sitecustomize.py文件中有一个名为“reload”的名称没有定义。

解决这个问题的一种方法是,确保roslaunch使用Python 3.8版本。你可以通过指定Python可执行文件的完整路径来实现这一点,例如:

$ /usr/bin/python3.8 /path/to/roslaunch mylaunchfile.launch

另一种方法是在Python 3.6环境中安装enum34包,该包提供了与Python 3.8中相同的枚举模块功能。你可以使用以下命令来安装该包:

$ pip install enum34

如果你还没有安装pip,请先安装pip,然后再运行上面的命令。

至于sitecustomize.py文件中的NameError异常,这可能与Python版本的更改有关。在Python 2.x中,reload是一个内置函数,但在Python 3.x中,它已被移动到了imp模块中,并且不再是内置函数。因此,如果sitecustomize.py文件是在Python 2.x中编写的,它可能会尝试使用一个不存在的函数。你可以查看sitecustomize.py文件并更新它以适应Python 3.x的变化。