ros2pkg python代码解析_ros2 运行pkg-程序员宅基地

技术标签: python  ros2  后端  开发语言  

python module加载
init.py的作用
ros2 加载过程
ros2pkg 文件目录

|-- CHANGELOG.rst
|-- package.xml
|-- resource
|   `-- ros2pkg
|-- ros2pkg
|   |-- __init__.py
|   |-- api
|   |   |-- __init__.py
|   |   `-- create.py
|   |-- command
|   |   |-- __init__.py  //说明这是一个包
|   |   `-- pkg.py
|   |-- resource
|   |   |-- __init__.py
|   |   |-- ament_cmake
|   |   |-- ament_python
|   |   |-- cmake
|   |   |-- cpp
|   |   `-- package_environment
|   `-- verb
|       |-- __init__.py
|       |-- create.py
|       |-- executables.py
|       |-- list.py
|       |-- prefix.py
|       `-- xml.py
|-- setup.py
`-- test
    |-- test_api.py
    |-- test_cli.py
    |-- test_copyright.py
    |-- test_flake8.py
    |-- test_pep257.py
    `-- test_xmllint.py

当我们运行ros2 pkg list时,会调用到rospkg包中,进入点,就是entry_points.txt中定义的

[ros2cli.command]
pkg = ros2pkg.command.pkg:PkgCommand

[ros2cli.extension_point]
ros2pkg.verb = ros2pkg.verb:VerbExtension

[ros2pkg.verb]
create = ros2pkg.verb.create:CreateVerb
executables = ros2pkg.verb.executables:ExecutablesVerb
list = ros2pkg.verb.list:ListVerb
prefix = ros2pkg.verb.prefix:PrefixVerb
xml = ros2pkg.verb.xml:XmlVerb

当运行ros2 pkg list,首先是进入这个函数

from ros2cli.command import add_subparsers_on_demand  #导入方法用于命令解决
from ros2cli.command import CommandExtension #导入类 

class PkgCommand(CommandExtension):
    """Various package related sub-commands."""

    def add_arguments(self, parser, cli_name):
        self._subparser = parser
        # add arguments and sub-commands of verbs
        add_subparsers_on_demand(
            parser, cli_name, '_verb', 'ros2pkg.verb', required=False)

    def main(self, *, parser, args):
        if not hasattr(args, '_verb'): #hasattr() 函数用于判断对象是否包含对应的属性。
            # in case no verb was passed
            self._subparser.print_help()
            return 0

        extension = getattr(args, '_verb') #函数用于返回一个对象属性值。

        # call the verb's main method
        return extension.main(args=args)

‘list = ros2pkg.verb.list:ListVerb’

from ros2pkg.api import get_package_names
from ros2pkg.verb import VerbExtension

class ListVerb(VerbExtension):
    """Output a list of available packages."""
    def main(self, *, args):
        for pkg_name in sorted(get_package_names()):
            print(pkg_name) #打印出包名

get_package_names实现在ros2pkg/api/init.py 文件


def get_package_names():
    return get_packages_with_prefixes().keys()
#定义在ros2下面install/lib/python3.6/site-packages/ament_index_python/packages.py文件里 
def get_packages_with_prefixes():
    """
    Return a dict of package names to the prefixes in which they are found.

    :returns: dict of package names to their prefixes
    :rtype: dict
    """
    return get_resources('packages')
    
#install/lib/python3.6/site-packages/ament_index_python/resources.py
def get_resources(resource_type):
    """
    Get the resource names of all resources of the specified type.

    :param resource_type: the type of the resource
    :type resource_type: str
    :returns: dict of resource names to the prefix path they are in
    :raises: :exc:`EnvironmentError`
    """
    assert resource_type, 'The resource type must not be empty'
    resources = {
    }
    for path in get_search_paths():
        resource_path = os.path.join(path, RESOURCE_INDEX_SUBFOLDER, resource_type)
        if os.path.isdir(resource_path):
            for resource in os.listdir(resource_path):
                # Ignore subdirectories, and anything starting with a dot
                if os.path.isdir(os.path.join(resource_path, resource)) \
                        or resource.startswith('.'):
                    continue
                if resource not in resources:
                    resources[resource] = path
    return resources

最终回调到 lib/python3.6/site-packages/ament_index_python/search_paths.py 文件

import os

from .constants import AMENT_PREFIX_PATH_ENV_VAR


def get_search_paths():
    """
    Get the paths from the environment variable '{AMENT_PREFIX_PATH_ENV_VAR}'.

    :returns: list of paths
    :raises: :exc:`EnvironmentError`
    """.format(AMENT_PREFIX_PATH_ENV_VAR=AMENT_PREFIX_PATH_ENV_VAR)
    ament_prefix_path = os.environ.get(AMENT_PREFIX_PATH_ENV_VAR)
    if not ament_prefix_path:
        raise EnvironmentError(
            "Environment variable '{}' is not set or empty".format(AMENT_PREFIX_PATH_ENV_VAR))

    paths = ament_prefix_path.split(os.pathsep)
    return [p for p in paths if p and os.path.exists(p)]

AMENT_PREFIX_PATH_ENV_VAR 赋值是

lib/python3.6/site-packages/ament_index_python/constants.py:17:AMENT_PREFIX_PATH_ENV_VAR = 'AMENT_PREFIX_PATH'

也就是我们配置环境变量AMENT_PREFIX_PATH
如果遇到找不到包的情况,多数没有配置路径AMENT_PREFIX_PATH

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yt_42370304/article/details/122584613

智能推荐

在if中 import按需引入插件_if import-程序员宅基地

文章浏览阅读1.1k次。在if中import引入插件昨天发生产忘记注释移动端的Vconsole插件把他带到了生产环境,整个人真是裂开了。因为impor不能直接在if中使用。之前一直都是发生产的时候手动注释引入和调用。但是昨天忘记注释了就很尴尬。之后查资料发现两种可以判断环境的引入方式异步引入(我没用这种试了一下没生效就没理他,但是看其它文章说是他是可以的)if(process.env.env == "test" || process.env.env == "devTest"){ import("vconsole").t_if import

Gradle2.0用户指南翻译——第六章. 构建脚本基础_output of gradle -q count-程序员宅基地

文章浏览阅读1.3k次。在整个Gradle,有两个最基础的概念:项目 和 任务。Everything in Gradle sits on top of two basic concepts: projects and tasks.任何一个Gradle构建都是由一个或多个项目组成。一个项目代表着什么,取决于你想通过Gradle来做什么。比如,一个项目可能代表着一个JAR库,或者是一个Web应用程序。它也可能代表从其他项目所生成的JAR包组装起来的ZIP文件。一个项目不一定是代表一个要构建的东西,它也可能代表一个要完成的东西,比_output of gradle -q count

impala 和 hive安装及基础使用_impala连接hive 方式-程序员宅基地

文章浏览阅读1k次。impala 安装具体安装步骤参照:https://gaoming.blog.csdn.net/article/details/107399914 里面包含完整的Hadoop组件安装。impala 使用登录impala-shell同步hive元数据invalidate metadata; #同步hive元数据show databases; #查看同步之后的数据库创建数据库create database db_hive_test;在impala-shell端创建_impala连接hive 方式

offer来了(长期更新)_offrr来了-程序员宅基地

文章浏览阅读607次。目录 java基础 集合 异常 反射 注解 内部类 泛型 序列化 网络编程 JVM JVM GC 并发编程 _offrr来了

org.apache.ibatis.exceptions.PersistenceException:记录mybatis 查询结果映射异常_cause: org.apache.ibatis.executor.result.resultmap-程序员宅基地

文章浏览阅读491次。mybatis 查询返回值映射异常具体异常异常理解解决方法具体异常org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'name' from result set. Cause: java.sql.SQLExc_cause: org.apache.ibatis.executor.result.resultmapexception: error attemptin

在 web of science上到导出txt文件_web of science怎么导出参考文献-程序员宅基地

文章浏览阅读7k次。在使用CiteSpace之前要先下载数据源,今天就来讲一讲从web of science上导出txt文件。1、首先登陆web of science,没有注册的先注册2、在选择数据库下拉框中选择web of science 核心合集3、在基本检索里输入你的关键字,点击搜索4、如果超过500条要多次导出,如果小于500条记录单次导出即可(此处只有165条)。导出方法为:点击导出,然后点击其他格式,然后选择记录来源输入数值1到最大记录数165,文件格式选择纯文本格式,选择好后单击导出即_web of science怎么导出参考文献

随便推点

【论文精读】VLP-MABSA —— Vision-Language Pre-Training for Multimodal Aspect-Based Sentiment Analysis_多模态情感分析论文-程序员宅基地

文章浏览阅读959次,点赞21次,收藏24次。本篇论文发表于ACL-2022原文链接源码模态:图像+文本基于多模态方面的情感分析(MABSA)近年来越来越受到关注。然而,以前的方法要么(i)单独使用预训练的视觉和文本模型,忽略了跨模态的对齐;要么(ii)使用预训练的视觉语言模型,这些模型带有一般的预训练任务,这不足以识别细粒度的方面、观点及其跨模态的对齐。本文提出了一个针对MABSA的任务特定的视觉语言预训练框架(VLPMABSA),这是一个统一的多模态编码器-解码器架构,用于所有预训练和下游任务。_多模态情感分析论文

什么是MTU?为什么MTU值普遍都是1500?_1492 1500-程序员宅基地

文章浏览阅读2.7w次,点赞13次,收藏28次。大学那会我玩魔兽世界,我的职业是法师,然后经常有朋友找我我带小号,带小号的方式是冲到血色副本里面把所有怪拉到一起,然后一起用AOE技能瞬间杀掉,在学校玩的时候没什么问题,但是放假在家的时候,我发现每次我拉好怪,放技能AOE的那个瞬间,很大概率会掉线,也不是网速问题,当时很多人也遇到同样的问题,看到个帖子说,把自己的MTU改成1480就行了,当时也不知道啥是MTU,就改了,发现还真的可以,就愉快地打..._1492 1500

搭建Physical ADG 11.2.0.3 for RAC-程序员宅基地

文章浏览阅读122次。1.主库中的操作:1.1 查看数据库是否在归档与是否强制LOGGING模式。 SQL> select log_mode,force_logging from v$database;..._11.2.0.3 rac adg

微型生物传感器,如何照亮地球最贫瘠的角落?-程序员宅基地

文章浏览阅读175次。通过一滴汗或血液,就可以测量人体十几项健康指标,或是提前预测癌症等大中型疾病,你认为这样近乎无创的医疗检测服务应该值多少钱?答案是,要么只能前往拥有专业仪器的医院来一套专项检查,要么就花上数百美元的价格购买一套家..._微型传感器怎么样

反转字符串中的元音字母-345_123290393-程序员宅基地

文章浏览阅读120次。每日一练,突破自我,梦想无惧算法!_123290393

Android测试adb常用命令_"adb -s \" + device + \" shell dumpsys gfxinfo \" -程序员宅基地

文章浏览阅读555次。移动端的Android测试总是少不了一些adb命令的操作,稍微总结一下自己经常用到的命令。例如:adb无法安装debug包,提示Failure [INSTALL_FAILED_TEST_ONLY],怎么办?莫慌,加个-t参数即可$ adb install -t debug.apk这一点在adb的说明中有明确的提示, -t 即表示允许test package$ adb........._"adb -s \" + device + \" shell dumpsys gfxinfo \" + package_name + \" framestats"