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
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
Cell In[1], line 1
----> 1 import cppyy
2 cppyy.include('zlib.h') # bring in C++ definitions
3 cppyy.load_library('libz') # load linker symbols
ModuleNotFoundError: No module named 'cppyy'
由于头文件可以包含其他头文件,因此将所有相关头文件聚合到单个头文件中以进行包含是很容易的。如果存在项目特定的包含路径,您可以通过 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 进行操作吧!