我使用Cython在C代码中使用Python函数。我需要使用C语言的参数来调用Python函数,但是编译器说我在调用Python函数时需要使用PyObject。例如,如果需要将整数传递给Python函数,该怎么办?
#include <Python.h>
#include "hello.h"
int main (int argc, char **argv)
{
printf ("Initializing Python Runtime...\n");
Py_Initialize ();
inithello();
PyObject *a;
start_app(a);
printf ("Cleanup...\n");
Py_Finalize ();
return 0;
}
我正在做这样的事情。 start_app是python中带有PyObject参数的函数,我如何初始化PyObject在python内部使用它?因为现在,当我尝试在python中打印(a)时,出现了Segfault
答案 0 :(得分:0)
据我所知,您有一个带有cdef public
函数的名为“ hello”的Cython模块,因此您可以从C:调用这些函数。
cdef public void start_app(arg):
# do something...
您想知道如何通过arg
。您有两种选择:
将arg
的类型定义为C类型(在Cython中):
cdef public void start_app(int arg):
这可能是最简单的解决方案-您只需传递一个C int。
在C中创建一个Python整数:
PyObject* arg = PyLong_FromLong(5); // in Python2 this would be PyInt_FromLong
start_app(arg);
Py_DECREF(arg); // drop our reference to it
请注意,我假设start_app
返回void
。如果它返回一个Python对象(除非另有说明,否则默认情况下会执行此操作),则必须针对NULL检查PyObject*
(如果有错误,则为NULL),然后处理该PyObject*
的引用计数(完成后将其解码)