ROS2 PubSub节点运行时导入自定义my_package报错求助
解决ROS2 Foxy中ros2 run导入外部包的ModuleNotFoundError问题
问题原因
直接运行python3 subscriber_member_function.py时,工作目录是脚本所在的src/py_pubsub/py_pubsub,../../../能正确定位到src目录下的my_package。但用ros2 run启动节点时,程序的工作目录是你执行ros2 run命令的目录(比如/src),此时相对路径../../../指向的是错误位置,导致找不到my_package。
解决方法
方法1:将my_package转为ROS2包(推荐)
把my_package改造为标准ROS2 Python包,让colcon自动管理依赖和路径:
- 给
my_package添加ROS2包必需文件:package.xml:声明包基本信息与依赖setup.py:配置包的安装参数setup.cfg:可选,用于entry_point等配置- 在
my_package目录下创建同名子目录并添加__init__.py
- 在
py_pubsub的package.xml中添加依赖声明:<depend>my_package</depend> - 在
py_pubsub的setup.py的install_requires中添加:install_requires=['setuptools', 'my_package'], - 重新构建两个包:
cd /src colcon build --packages-select my_package py_pubsub . install/setup.bash - 此时可直接在脚本中导入,无需手动修改sys.path:
import my_package
方法2:动态计算绝对路径(适用于非ROS2包的my_package)
修改脚本中的路径处理逻辑,基于脚本自身位置动态定位src目录:
import os import sys # 获取当前脚本的绝对路径 script_path = os.path.abspath(__file__) # 从脚本路径向上回溯到src目录 src_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(script_path)))) sys.path.append(src_dir) import my_package
这种方式不管程序在哪个工作目录启动,都能正确找到src下的my_package。
方法3:手动添加PYTHONPATH(临时方案)
在执行ros2 run前,手动把src目录添加到PYTHONPATH:
cd /src export PYTHONPATH=$PYTHONPATH:/src ros2 run py_pubsub listener
但该方式每次启动都需要重复设置,不适合长期使用。
内容的提问来源于stack exchange,提问作者pongoS
相关产品推荐
相关产品推荐

