使用Cython使用args调用Python函数

时间:2019-03-02 10:52:56

标签: python cython

我使用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

1 个答案:

答案 0 :(得分:0)

据我所知,您有一个带有cdef public函数的名为“ hello”的Cython模块,因此您可以从C:调用这些函数。

cdef public void start_app(arg):
    # do something...

您想知道如何通过arg。您有两种选择:

  1. arg的类型定义为C类型(在Cython中):

    cdef public void start_app(int arg):
    

    这可能是最简单的解决方案-您只需传递一个C int。

  2. 在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*的引用计数(完成后将其解码)