项目场景:
ROS里面创建包并创建scripts文件夹写包含自己模块的Python功能包
问题描述
写好自己的包编译后rosrun运行时报如下错误:
rosrun xxx xxx.py
Traceback (most recent call last):
File "/home/xxx/xxx_ws/devel/lib/xxx/xxx.py", line 15, in <module>
exec(compile(fh.read(), python_script, 'exec'), context)
File "/home/xxx/xxx_ws/src/xxx/scripts/xxx.py", line 16, in <module>
from joints import Joint
ImportError: cannot import name 'Joint' from 'joints'
script同级目录存在joints.py这个模块也有Joint这个类,并且都赋予了可执行权限,但rosrun运行的时候就是死活找不到这个模块。
原因分析:
经过大量的资料查阅,最终定位到我的问题是因为Python包重名,也就是模块重名导致Python不知道导哪个包。
按照Autolabor官网,赵老师课程1.3.3 HelloWorld(Python版)创建Python节点时第三步:3.编辑 ros 包下的CMakeLists.txt 文件
其中需要这样的步骤:
catkin_install_python(PROGRAMS scripts/自定义文件名.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
原因是因为这句话catkin_install_python会将Python文件复制到devel/lib文件夹里面导致Python导的包重名了,所以Python在ROS下是能直接执行的最好不要install
解决方案:
将devel/lib文件夹里面的Python文件删除,然后不在CMakeLists.txt,写那句话,即注释掉
catkin_install_python(PROGRAMS scripts/自定义文件名.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
然后重新catkin_make编译一下,就可以直接运行了。
参考:
[ros+python]无法rosrun 导入自定义.py文件的python可执行文件
ROS——python3包 调用自定义.py文件
解决Python导入自定义模块时ModuleNotFoundError问题
ImportError: cannot import name ‘XXXXX‘ from ‘XX‘解决方案
ImportError :cannot import name xxxxxx 的三种类型的解决方法
拓展:
python ros导入自定义包的问题
ROS中在一个功能包中导入另一个功能包的python模块
Python import: rosrun works well but roslaunch reports error
Using rosrun breaks python3 import