由于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
看了一些帖子,每个人的情况不一样,不敢乱模仿,希望大家给支支招,谢谢大家!
功能包是存放在 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版本不一致。可以尝试以下几个步骤:
$ echo "alias python=python3.6" >> ~/.bashrc
$ source ~/.bashrc
其中 python3.6
指的是ROS所需的Python版本。
$ catkin_make clean
$ catkin_make
$ source devel/setup.bash
$ 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,则需要相应调整路径。
希望以上方法对你有帮助。
如果我的回答解决了您的问题,请采纳!
ls /usr/bin/python*
sudo update-alternatives --config python
sudo apt-get install --reinstall ros--ros-core
sudo apt-get install --reinstall python3
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的变化。