如何对 Python-ROS2 包进行 cython 化以隐藏源代码?

How to cythonize a Python-ROS2 package in order to hide the source code?

我有一个 ROS2-python (rclpy) 包,其中包含多个协同工作的子包。我想对包进行 cythonize 处理以隐藏源代码,只留下可执行文件来完成这项工作。知道如何使用包的 setup.py 和启动文件做到这一点吗?

所以我会回答我自己的问题,以防有人遇到同样的问题。要在 python 中对 ros2 包进行 cython 化处理,最好的方法是将所需的 cython 组件分别添加到每个包的 setup.py 中。为了更好地理解,我已经标记了 cython 部分(带有 <--)。

请注意,使用 colcon 构建包后,python 源代码的副本将存储在 colcon 生成的安装目录下。您可以轻松地手动删除它们,并且程序包应该 运行 包含生成的 c 和共享对象文件。

from glob import glob
from setuptools import setup
from Cython.Build import cythonize <--
import os

package_name = 'your_package_name_here'

files = package_name + "/*.py"

setup(
    ext_modules=cythonize(files,compiler_directives={'language_level' : "3"},force=True,quiet=True), <--
    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']),
        (os.path.join('share', package_name), glob('launch/*.launch.py'))
    ],
    install_requires=['setuptools', "wheel",  "Cython"], <--
    zip_safe=True,
    maintainer='NAME',
    maintainer_email='EMAIL',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            'SOME CODE HERE',
        ],
    },
)