如何对 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',
],
},
)
我有一个 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',
],
},
)