我刚刚开始玩Python C扩展,并且很好奇为什么可以从Python调用的C函数必须使用2个PyObject *参数并返回一个PyObject *。我写了下面的 “Hello World” 扩展名:Python C扩展 - 为什么必须调用C函数需要参数并返回PyObject *
#include <Python.h>
static PyObject *
hello_world(PyObject *self, PyObject *noargs)
{
printf("Hello World\n");
return Py_BuildValue("");
}
// Module functions table.
static PyMethodDef
module_functions[] = {
{ "hello_world", hello_world, METH_NOARGS, "hello world method" },
{ NULL }
};
// This function is called to initialize the module.
PyMODINIT_FUNC
inittesty2(void)
{
Py_InitModule("testy2", module_functions);
}
为什么我不能(尤其是METH_NOARGS)使用下列程序hello_world方法:
static void
hello_world()
{
printf("Hello World\n");
}
?
它是'Py_None',而不是'PyNone'。还有'Py_RETURN_NONE'类似于'Py_RETURN_TRUE'和'Py_RETURN_FALSE'。 – yak 2012-04-21 10:09:41
对于(3),纠正我,如果我错了,但如果代码使用调用约定,所有参数都在堆栈上传递,并且被调用者(函数)将它们从堆栈弹出,则删除未使用的参数会导致因为Python会一直通过NULL作为第二个参数,并且该函数不会弹出它。 – yak 2012-04-21 10:15:49
@yak它不会导致我的代码崩溃。 – jogojapan 2012-04-21 10:16:57