从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?

Posted

技术标签:

【中文标题】从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?【英文标题】:How to pass C++ classes as arguments when calling python functions from C++? 【发布时间】:2014-12-07 23:33:02 【问题描述】:

我正在编写一个需要加载 Python 模块并调用该模块中的函数的 C++ 应用程序。 应用程序需要将 C++ 分类作为参数传递给 python 函数。 我设法从 C++ 代码中调用 python 代码,但我只设法将“原始”类型作为参数传递。

我使用 SWIG 创建包装器/接口,但我找不到如何将我的 C++ 类从应用程序转换为 PyObject* 以便将其作为参数传递给 python 函数。

您知道我在哪里可以找到有关如何执行从 C++ 转换为 PyObject* 的信息吗?

【问题讨论】:

【参考方案1】:

Boost 有一个 Python 接口库,可能对你有帮助。

check it out

heres the documentation on functions

【讨论】:

【参考方案2】:

我仍然没有解决方案,我只有以下解决方法: 1. 我从实例创建一个 PyObject,并将它传递给 python 函数。 2. python 代码,使用 SWIG 生成的库中的一个函数,将 PyObject 转换为该类的 python 版本。

实现:

在 C++ 文件中

MyClass myObject;
...
PyObject *parameterForPython = PyCObject_FromVoidPtr(&myObject, NULL); // step 1
PyTuple_SetItem(pyArgs, 0, parameterForPython);
PyObject_CallObject(pythonFunctionObject, pyArgs);

在 swig 接口文件中(步骤 2 的代码):

%inline %
    MyClass *convertPyObjectToMyClass(PyObject * ptr) 
        return (MyClass *)PyCObject_AsVoidPtr(ptr)
    
%

在python模块中:

def myPythonFunction(ptr):
    myObject = cppmodule.convertPyObjectToMyClass(ptr) #step 2

【讨论】:

【参考方案3】:

您考虑过使用SWIG_NewPointerObj(ptr, type, flags)SWIG_ConvertPtr(obj, pptr, type, flags) 吗?

您可以通过运行获得这些声明:

swig -python -external-runtime swig-python.h

【讨论】:

以上是关于从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章

从 cython c 调用 python 函数时的奇怪行为

从 C++ 调用 Python

使用线程在python中调用多个c++函数

如何将数组从 c++ 传递给 python 函数并将 python 返回的数组检索到 c++

如何使用 QT/python 从 Javascript 调用 C++ 函数?

Python 绑定:从 Python 调用 C 或 C++