【发布时间】:2018-11-08 20:39:30
【问题描述】:
首先,为令人困惑的标题道歉。
我想要实现的是:假设我有一些函数foo,它接受一个函数和一个整数作为输入。例如
int foo(int(*func)(), int i) {
int n = func() + i;
return n;
}
现在,我想将此函数包装在一个 python 扩展模块中。所以我开始写我的界面:
#include <Python.h>
extern "C" {
static PyObject* foo(PyObject* self, PyObject* args);
}
static PyMethodDef myMethods[] = {
{"foo", foo, METH_VARARGS, "Runs foo"},
{NULL, NULL, 0, NULL}
}
// Define the module
static struct PyModuleDef myModule = {
PyModuleDef_HEAD_INIT,
"myModule",
"A Module",
-1,
myMethods
};
// Initialize the module
PyMODINIT_FUNC PyInit_BSPy(void) {
return PyModule_Create(&myModule);
}
//Include the function
static PyObject* foo(PyObject* self, PyObject* args){
// Declare variable/function pointer
int(*bar)(void);
unsigned int n;
// Parse the input tuple
if (!PyArg_ParseTuple(args, ..., &bar, &n)) {
return NULL;
}
}
现在,当需要解析输入元组时,我感到很困惑,因为我不确定如何解析它。这个想法很简单:我需要能够在 python 中调用foo(bar(), n)。但我可以使用一些帮助来实现这一点。
【问题讨论】:
-
我不确定这是否合理。 Python 没有与 C 相同的指针概念。您可以将 Python 调用包装在 C 函数中,然后将该 C 函数作为参数传递给您的
foo函数吗? -
您尝试完全
int foo(int(*func)(void), int i)包装的C 函数的签名吗?如果它真的是像int foo(int (*func)(void *data), int i, void *data)这样的东西,那么你想要做的事情会容易得多,其中func将被调用,你提供的任何东西都是data作为它的参数。 -
啊哈,一个采用 C++ 的替代方案
std::function!这使它变得可行。我会写一个答案。 -
既然你的目标是 CPython,你不关心它的 Global Interpreter Lock,它限制了单个 Python 实例中可实现的并行性吗?
-
鉴于这是一个并行处理用例,您可能需要处理the interface for calling Python functions from threads not created by Python。
标签: python c python-c-api