ament_cmake_python 用户文档

ament_cmake_python 是一个为包含 Python 代码的 ament_cmake 构建类型的软件包提供 CMake 函数的软件包。有关更多信息,请参阅 ament_cmake 用户文档

注解

在大多数情况下,纯 Python 包应使用 ament_python 构建类型。要创建一个 ament_python 包,请参阅 创建你的第一个 ROS 2 包ament_cmake_python 仅在不可能的情况下才应使用,例如在混合使用 C/C++ 和 Python 代码时。

基础知识

基本项目概述

具有``ament_cmake``构建类型,并使用``ament_cmake_python``的名为"my_project"的软件包的概要如下:

.
└── my_project
    ├── CMakeLists.txt
    ├── package.xml
    └── my_project
        ├── __init__.py
        └── my_script.py

``__init__.py``文件可以为空,但需要它来`使Python将包含它的目录视为软件包 <https://docs.python.org/3/tutorial/modules.html#packages>`__。在``CMakeLists.txt``旁边还可以有一个包含C/C++代码的``src``或``include``目录。

使用ament_cmake_python

该软件包必须在其``package.xml``中声明对``ament_cmake_python``的依赖关系。

<buildtool_depend>ament_cmake_python</buildtool_depend>

CMakeLists.txt 应包含:

find_package(ament_cmake_python REQUIRED)
# ...
ament_python_install_package(${PROJECT_NAME})

ament_python_install_package() 的参数是与包含 Python 文件的 CMakeLists.txt 并列的目录的名称。在这种情况下,它是 my_project 或者 ${PROJECT_NAME}

警告

在同一个 CMake 项目中调用 rosidl_generate_interfacesament_python_install_package 是不起作用的。请参阅此 Github 问题 了解更多信息。最佳实践是将消息生成分离到一个单独的包中。

然后,另一个正确依赖于 my_project 的 Python 包可以将其作为普通的 Python 模块使用:

from my_project.my_script import my_function

假设 my_script.py 包含一个名为 my_function() 的函数。

使用 ament_cmake_pytest

ament_cmake_pytest 用于使测试在 cmake 中可被发现。包必须在其 package.xml 中声明对 ament_cmake_pytest 的测试依赖。

<test_depend>ament_cmake_pytest</test_depend>

假设该包的文件结构如下所示,其中的测试位于 tests 文件夹中。

.
├── CMakeLists.txt
├── my_project
│   └── my_script.py
├── package.xml
└── tests
    ├── test_a.py
    └── test_b.py

CMakeLists.txt 应包含:

if(BUILD_TESTING)
  find_package(ament_cmake_pytest REQUIRED)
  set(_pytest_tests
    tests/test_a.py
    tests/test_b.py
    # Add other test files here
  )
  foreach(_test_path ${_pytest_tests})
    get_filename_component(_test_name ${_test_path} NAME_WE)
    ament_add_pytest_test(${_test_name} ${_test_path}
      APPEND_ENV PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR}
      TIMEOUT 60
      WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    )
  endforeach()
endif()

与支持自动测试发现的ament_python的使用相比,ament_cmake_pytest必须使用每个测试文件的路径进行调用。超时时间可以根据需要缩短。

现在,您可以使用:doc:`标准的colcon测试命令<../Tutorials/Intermediate/Testing/CLI>`来调用您的测试。