【问题标题】:Python C API. Pass pointer to C++ function to existing Python filePython C API。将指向 C++ 函数的指针传递给现有的 Python 文件
【发布时间】:2018-04-10 14:03:03
【问题描述】:

我有一个 C++ 代码调用名为“filename”的 python 脚本的一个名为“function”的函数。

PyObject module= PyImport_ImportModule("filename");
PyObject *python_fn = PyObject_GetAttrString(module, (char *)"function");
PyObject *args = PyTuple_New(0);
PyObject_CallObject(python_fn , args);

函数调用正确。现在我希望能够将指向 C 函数的指针传递给 python 模块。 我按照here 的描述尝试了PyImport_AppendInittab,但没有运气。

有什么建议吗?

谢谢 H.

【问题讨论】:

  • 这个c++11怎么样?
  • 我对 C++11 中的解决方案持开放态度。
  • 目前尚不清楚您在这里实际尝试做什么 - 您拥有的代码与传递 C 函数指针完全无关。您想将 C 函数指针传递给需要 Python 可调用函数的函数吗? (Inittab 是用来设置内置模块而不需要 .so 文件,所以我认为这里不适用)
  • 代码就是我现在拥有的。不是代码不起作用。我想添加可以传递 C 函数指针并从 python 调用该函数的功能。抱歉没有说清楚。

标签: c++ python-3.x c++11 python-c-api


【解决方案1】:

为了将 C/C++ 函数指针传递给 Python 函数,您需要将其转换为 Python 对象(因为 Python 函数的所有参数都必须是 Python 对象)。您可以创建一个带有如下轮廓的 DIY 版本:

typedef struct {
   PyObject_HEAD
   int (*ptr)(int, int); // assuming this matches the signature of the function pointer
} MyFuncPtr;

PyObject* Call_MyFuncPtr(MyFuncPtr* self, PyObject* args, PyObject* kwargs) {
  // implementation goes here...
  //  you probably want to convert the Python arguments to C with PyArg_ParseTupleAndKeywords
  //  call the function
  //  then convert the C return value back to a PyObject* and return that
}

关联的PyTypeObject 的定义与the tutorial 中的一样 - 您需要做的唯一更改是将tp_call 设置为Call_MyFuncPtr 以便可以在Python 中调用该类型(您可能需要在此处进行转换-由于第一个参数的类型,签名不完全匹配)。您无需将其添加到模块对象(因为无论如何它只能从 C 中访问),但您确实需要在其上调用 PyType_Ready

然后你会使用分配它

MyFuncPtr* mfp = PyObject_New(MyFuncPtr,&MyFuncPtr_Type)
mfp->ptr = // some matching C/C++ function

并使用标准 C API 函数调用将其作为参数传递给 Python。


您可能希望避免自己执行此操作并使用现有库。对于 C++,Boost Python 定义了自动执行此操作的 a nice wrapperPyBind11 也是如此。您可能还可以使用 Ctypes 或 CFFI 库,但对我而言,您如何通过 C 或 C++ 与它们进行交互并不是很明显。

【讨论】:

    猜你喜欢
    • 2017-08-09
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多