Python C API: 将两个特殊类型的多参数函数作为模块传递
Python C API: Passing two functions of many parameters with special types as module
我正在尝试使用 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 创建一个适当的界面,但它不起作用。这是我尝试将 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 模块。该模块有两个可调用函数 - 一个支持 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 创建一个适当的界面,但它不起作用。这是我尝试将 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 *
。