导出 Python 的C++类

Export of C++ classes for Python

本文关键字:C++ Python 导出      更新时间:2023-10-16

我有一个用C++编写的程序(现在作为一个静态库(,具有非常抽象的接口,在我的类等上使用运算符重载。我想用它创建一个共享库(在尝试其他平台之前,Windows 上的 DLL 将是第一步(以在其他更"用户友好"的语言中使用它。我读到Python的ctypes对此有一定程度的支持。

我只想知道,在我投入时间尝试做某事之前,是否可以使用来自 Python 中 C++ DLL 的一些更高级别抽象来选择正确的选项,那是不可能的。用户应该能够初始化我的程序提供的类,并将它们与所有方法一起使用,包括重载运算符(当然只有那些在python中可用的运算符(。还是 Python 只是为了支持一些简单的函数调用等?

C++代码(甚至只是用户可访问的类(是巨大的,我想避免创建单独的 Python 包装器,因为所有需要的功能都已经在C++中完成。

既然没有人回答,我将提供我在此期间收集到的一切。希望它可能对某些人有所帮助。

Python 的 ctypes 旨在仅支持 C 语言功能。因此,无法使用 ctypes 直接从 Python 访问类和其他C++对象。但是,有一些方法可以访问它们。

繁琐的方法

为C++ 类创建 C 样式对象,然后为它们创建 Python 包装器。

C 样式对象基本上是指向动态分配的C++对象的指针。它应该有其他方法,例如传统命名的->Release()来销毁对象并释放分配的内存。然后,您需要手动创建类似于原始C++对象的python包装器,包括重载运算符等(旁注:我遇到的唯一运算符,在这种情况下可能需要并且在Python中不可重载的是赋值运算符。

当您想要完全控制正在发生的事情并且不介意在 Python 中复制接口时,这可能是最好的解决方案。

快速方法

Boost提供了一个 Boost::P ython 库来处理这个问题。它允许您导出几乎任何您需要的东西 - 类,运算符,甚至多个重载方法。

唯一的问题是,这个库非常大,它是非仅标题的 Boost 库之一,所以你需要弄清楚如何使用你的项目构建它,这对于从未使用 Boost 的人来说可能并不容易(比如我自己(。

我不知道这个库到底做了什么,也许它只是自动执行前面方法中描述的相同事情。所以我不确定它是否降低了额外包装器的级别,或者只是简单地为您完成所有艰苦的包装工作,但它完成了我需要做的事情。

更快的方法

幸运的是,我遇到了另一种选择 - pybind11。这是一个相对较小的库,与 Boost::P ython 做同样的事情,并且它只是标头。它有很好的文档并且易于使用。它被称为 pybind 11,因为它最初是为了支持 C++11,但它目前支持 C++14 和实验性 C++17,但我在 C++17 项目中使用它,到目前为止没有发现任何问题。

我还不确定哪种方法最适合我的项目,但现在,我使用 pybind11,只是为了让在项目开发过程中更容易。