使用cython从C导入python调用python文件

时间:2017-08-16 16:40:17

标签: python c cython

这个问题基于this one,但有一个转折点。我想使用cython编译一个python函数,然后在C中调用它。在这个简单的例子中,它可以工作,但是当我尝试从我的python代码导入另一个python模块时,它不起作用。

world.pyx

def world():
    return 10

hello.pyx

import world

def hello():
    ret = 5 + world()
    return ret

cdef public int call_hello():
    return hello()

的main.c

#include <Python.h>
#include "hello.h"

int main() {
  Py_Initialize();
  PyInit_hello();
  int v = call_hello();

  printf("the value is %d\n",v);

  Py_Finalize();
  return 0;
}

cython -3 --force world.pyx hello.pyx
clang -c world.c hello.c main.c -I/Users/aneben/.pyenv/versions/3.6.1/Python.framework/Versions/3.6/include/python3.6m -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
clang -L/Users/aneben/.pyenv/versions/3.6.1/Python.framework/Versions/3.6/lib/python3.6/config-3.6m-darwin -lpython3.6m -ldl -framework CoreFoundation world.o hello.o main.o  -o main

如果我只是将world函数移动到hello.pyx,那么它可以正常工作。但是当我导入它时,它无法正常工作。

./主

NameError: name 'hello' is not defined
Exception ignored in: 'hello.call_hello'

2 个答案:

答案 0 :(得分:0)

import world导入模块,而不是函数。

要从其他模块中呼叫world(),您必须使用world.world()

答案 1 :(得分:0)

一个解决方案似乎是在主函数中添加对PyInit_world();的调用。 Cython将此函数添加到world.c,即使在这种情况下它不会生成头文件,因此我们会收到警告,但它可以正常工作。

有没有办法让hello.c自动调用PyInit_world(),以便main.c不需要知道这一点?这样,C include层次结构将反映python层次结构。