gpt4 book ai didi

c - Python C API : Passing two functions of many parameters with special types as module

转载 作者:太空宇宙 更新时间:2023-11-04 02:41:53 24 4
gpt4 key购买 nike

我正在尝试使用 C 创建一个 Python 模块。该模块有两个可调用函数 - 一个支持 mpi,一个不支持。

int run_mymodule(char *file1, char *file2, char *file3, PyObject *tmpp)
{
<internal actions, returns int indicating return status>
}

int run_mymodule_with_mpi(char *file1, int &_mpi, char *file2, char *file3, PyObject *tmpp)
{
<internals, returns int>
}

使用 boost,连接到模块很简单(使用 BOOST_PYTHON_MODULE)。然而,事实证明,使用纯 python-c api 更具挑战性。我已尽力为 python 创建一个适当的接口(interface),但它不起作用。这是我尝试将 C 函数作为模块连接到 python。我的方法怎么不对?我从这里去哪里?

static PyMethodDef myModule_methods[] = {
{"run_mymodule", run_mymodule, METH_VARARGS},
{"run_mymodule_with_mpi", run_mymodule_with_mpi, METH_VARARGS},
{NULL, NULL}
};

void initmyModule(void)
{
(void) Py_InitModule("myModule", myModule_methods);
}

最佳答案

PyCFunction 类型定义为

typedef PyObject *(*PyCFunction)(PyObject *, PyObject *);

所以你需要先用一个真正的 PyCFunction 包装你的函数。您可以使用以下作为如何开始使用它的简单模板:

static PyObject * wrap_run_mymodule(PyObject *, PyObject *args) {
char *file1, *file2, *file3;
PyObject *tmpp;
if(!PyArg_ParseTuple(args, "sssO", &file1, &file2, &file3, &tmpp))
return NULL;
return Py_BuildValue("i", run_mymodule(file1, file2, file3, tmpp));
}

static PyMethodDef myModule_methods[] = {
{"run_mymodule", (PyCFunction) wrap_run_mymodule, METH_VARARGS},
{NULL, NULL}
};

另见 PyArg_ParseTuple为你的论点找到更好的格式。特别是 file[123] 变量在这里应该是 const char *

关于c - Python C API : Passing two functions of many parameters with special types as module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31018038/

24 4 0