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 *