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

标签 c++ python swig boost-python

我想知道是否有任何方法可以在不构建中间共享库的情况下将 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/

相关文章:

c++ - 在 protobuf 中处理可选消息的正确方法是什么?

python - 如何使用 Python 列表使用 SWIG 在 C++ 中分配 std::vector?

c++ - 用 swig 包裹 boost::ublas

python - 使用 SWIG 将 C 结构数组访问到 Python

javascript - 如何超时终止该子进程?

C++ 为什么这些构造函数调用中有 3 个有效,而一个无效?

c++ - 同时运行两个程序 C/C++

c++ - 可以在可变参数模板中推导出容器类型吗?

python - 单独向列表添加值

python - 并行dask for循环比常规循环慢?