gpt4 book ai didi

c++ - 如何在不构建模块的情况下将 C++ 类公开给 Python

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:35 25 4
gpt4 key购买 nike

我想知道是否有任何方法可以在不构建中间共享库的情况下将 C++ 类公开给 Python。

这是我想要的场景。例如我有以下 C++ 类:

class toto
{
public:
toto(int iValue1_, int iValue2_): iValue1(iValue1_), iValue2(iValue2_) {}
int Addition(void) const {if (!this) return 0; return iValue1 + iValue2;}

private:
int iValue1;
int iValue2;
};

我想以某种方式将此类(或其实例)转换为 PyObject*,以便将其作为参数(args)发送到例如 PyObject_CallObject:

PyObject* PyObject_CallObject(PyObject* wrapperFunction, PyObject* args)

另一方面,在我的 python 端,我将有一个 wrapperFunction,它将我的 C++ 类(或其实例)上的指针作为参数,并调用其方法或使用其属性:

def wrapper_function(cPlusPlusClass):
instance = cPlusPlusClass(4, 5)
result = instance.Addition()

如您所见,我真的不需要/不想拥有单独的共享库或通过 boost python 构建模块。我所需要的只是找到一种将 C++ 代码转换为 PyObject 并将其发送到 python 的方法。我找不到通过 C python 库、boost 或 SWIG 来做到这一点的方法。

最佳答案

据我所知,没有简单的方法可以做到这一点。

要使用既没有模块也没有中间库的 C++ 扩展 Python,需要动态加载库,然后导入函数。 ctypes 使用此方法模块。要用 C++ 完成同样的事情,需要编写一个 ctypes-like 库来理解目标编译器的 C++ ABI。

要在不引入模块的情况下扩展 Python,可以创建一个中间库,它提供了一个包装 C++ 库的 C API。然后可以通过 ctypes 在 Python 中使用此中间库。虽然它不提供确切的调用语法并且确实引入了一个中间库,但它可能比构建一个可以直接与 C++ 接口(interface)的 ctypes-like 库更省力。

但是,如果要引入中间库,则可能值得使用 Boost.Python、SWIG 或其他一些 C++/Python 语言绑定(bind)工具。虽然其中许多工具将通过模块引入扩展,但它们通常提供更简洁的调用约定、更好的绑定(bind)过程中的错误检查,并且可能更易于维护。

关于c++ - 如何在不构建模块的情况下将 C++ 类公开给 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18442403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com