cppyy 快速指南

cppyy 快速指南#

大型代码库将从更高级的功能中受益,例如用于向客户端提供更清洁接口的pythonizations;用于更快解析和减少内存使用的预编译模块;用于打包位置和管理依赖项的“字典”;以及用于自动、延迟加载的映射文件。然而,仅使用基本功能也可以取得很大进展,对于包含较少类的小包甚至可能完全足够。

cppyy 的工作原理是通过解析 C++ 定义,利用 cling 生成微小的包装代码以尊重编译时特性并创建标准化接口,然后使用 clang JIT 编译/链接这些包装。因此,它只需要这两个成分:C++ 定义和链接器符号。所有 cppyy 使用的,无论是基础的还是更高级的功能,都是将这两者在使用点结合起来的变化形式。

定义通常存在于头文件中,而符号则在库中。可以使用 cppyy.include 加载头文件,使用 cppyy.load_library 调用加载库。加载头文件足以开始探索,cppyy.gbl 是所有C++事物的起始点,而链接器符号只在首次使用时才需要。

以下是使用 zlib 库的示例,该库很可能在您的系统上可用:

import cppyy
cppyy.include('zlib.h')        # bring in C++ definitions
cppyy.load_library('libz')     # load linker symbols
cppyy.gbl.zlibVersion()        # use a zlib API
/media/pc/data/lxw/envs/anaconda3x/envs/xxx/bin/python3.12: not an ELF file.
'1.2.13'

由于头文件可以包含其他头文件,因此将所有相关头文件聚合到单个头文件中以进行包含是很容易的。如果存在项目特定的包含路径,您可以通过 cppyy.add_include_path 添加这些路径。如果一个头文件仅用于 C 语言并且没有设置为与 C++ 一起使用,那么请使用 cppyy.c_include,它会在头文件周围添加 extern "C"

库文件可以通过将所有相关的库链接到一个库中来进行聚合。使用链接器进行此操作允许像往常一样应用常规系统特性,例如 rpath 和环境变量(如 LD_LIBRARY_PATH)。请注意,任何暴露库符号的机制都将起作用。例如,您也可以通过带有 ctypes.RTLD_GLOBAL 选项的标准模块 ctypes 使用 ctypes.CDLL

要进行探索,可以从 cppyy.gbl 开始直接访问您的命名空间、类、函数等;或者使用 Python 的 dir(或 tab 补全)来查看可用的内容。使用 Python 的 help 来查看类的方法和数据成员的列表,以及查看函数的接口。

现在,尝试对您自己的一些头文件、库和 API 进行操作吧!