我已经为Python创建了一个存储库,我已经为它添加了一个包。我遇到的问题是,在原始存储库中,来自自己的repo的模块是直接导入的,而在我的存储库中,我必须在模块前面添加ROS2包名称,即使我是从同一个repo导入模块,比如:
import planner_pkg.SimpleOneTrailerSystem as SimpleOneTrailerSystem
我想:
import SimpleOneTrailerSystem
我的ROS2项目结构如下:
ros2_ws
src
planner
planner_pkg
__init__.py
SimpleOneTrailerSystem.py
planner_node.py
...
package.xml
setup.py
在包.xml在
^{pr2}$在设置.py公司名称:
from setuptools import setup
package_name = 'planner_pkg'
setup(
name=package_name,
version='0.0.0',
packages=[package_name],
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
author='',
author_email='',
maintainer='',
maintainer_email='',
keywords=['ROS'],
classifiers=[
'Intended Audience :: Developers',
'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python',
'Topic :: Software Development',
],
description='Package containing examples of how to use the rclpy API.',
license='Apache License, Version 2.0',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'planner_node = planner_pkg.planner_node:main',
],
},
)
这个答案已经很晚了,但我最近刚建立了一个ROS2项目,我想我可以解释一下进口产品发生了什么。在
首先,根据Module Search Path文档,当您执行}:
import something
操作时,Python会在以下位置查找{sys.path
,它是一个list
,包含:PYTHONPATH
,这是一个包含目录列表的环境变量其次,在构建ros2python包时(通过调用
colcon build
调用ament_python
构建类型),Python代码将被复制到一个树结构如下的install文件夹中:现在,当您执行
^{pr2}$import SimpleOneTrailerSystem
操作时,Python将首先从内置模块中搜索它(这肯定不会在那里找到),然后从sys.path
中搜索。您可以在规划器的顶部添加print(sys.path)
_节点.py要查看以下列表:在
sys.path
列表中,首先是输入脚本的bin文件夹,它将是planner_node(指定为中的入口点)设置.py)。没有SimpleOneRailerSystem.py文件/模块(或任何其他文件)在bin文件夹中,这样导入将失败。在列表中的下一个将是planner_pkg/lib/pythonX.X/site-packages,从上面的树结构可以看出,有一个SimpleOneRailerSystem.py模块但它位于计划器包文件夹下。所以像这样的直接进口
不起作用。您需要使用包文件夹来限定它,如下所示:
有两种方法可以解决这个问题。在
在
import
-ingSimpleOneTrailerSystem
之前修改sys.path
此方法将
planner_pkg
install目录的路径添加到sys.path
列表中,这样就不需要在后续导入中指定它。在运行ROS2节点之前修改
PYTHONPATH
此方法与第一种方法几乎相同,但不涉及代码更改(也不涉及重建),因为您只需要修改
PYTHONPATH
环境变量。相关问题 更多 >
编程相关推荐