这个问题基于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'
答案 0 :(得分:0)
import world
导入模块,而不是函数。
要从其他模块中呼叫world()
,您必须使用world.world()
答案 1 :(得分:0)
一个解决方案似乎是在主函数中添加对PyInit_world();
的调用。 Cython将此函数添加到world.c
,即使在这种情况下它不会生成头文件,因此我们会收到警告,但它可以正常工作。
有没有办法让hello.c
自动调用PyInit_world()
,以便main.c
不需要知道这一点?这样,C include层次结构将反映python层次结构。