我试图从c调用一些python代码,我试图按照cython user guide的方式来执行该操作。
我有一个cython脚本,modulename.pyx
看起来像这样(取自用户指南):
cdef public struct Bunny: # public type declaration
int vorpalness
cdef public int spam # public variable declaration
cdef public void grail(Bunny b): # public function declaration
print "Ready the holy hand grenade"
我有一个c程序,main.c,看起来像这样(也来自指南):
#include <Python.h>
#include "modulename.h"
int main() {
Py_Initialize();
initmodulename();
struct Bunny b;
grail(b);
Py_Finalize();
}
我试图以各种方式进行编译,但没有运气。我可以使用cython modulename.pyx
将.pyx文件编译得足够好,生成modulename.c
和modulename.h
。当我想编译和链接这些生成的文件以及我的c程序时,就会遇到麻烦。
以下是我一直在尝试的一个例子:
cc -fno-strict-aliasing -fno-common -dynamic -g -Os -pipe -fno-common -fno-strict-aliasing -fwrapv -DENABLE_DTRACE -DMACOSX -DNDEBUG -Wall -Wstrict-prototypes -DNDEBUG -g -fwrapv -Os -Wall -Wstrict-prototypes -DENABLE_DTRACE -pipe -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c main.c modulename.h modulename.c
这给了我这些错误:
modulename.h:25:32: error: expected function body after function declarator
__PYX_EXTERN_C DL_IMPORT(void) grail(struct Bunny);
^
modulename.h:27:31: error: expected function body after function declarator
__PYX_EXTERN_C DL_IMPORT(int) spam;
^
modulename.h:32:1: error: unknown type name 'PyMODINIT_FUNC'
PyMODINIT_FUNC initmodulename(void);
^
3 errors generated.
我想我正在寻找的是关于让示例工作的一些指导,或者是指向一些使用cython从c调用python代码的示例代码的指针。
答案 0 :(得分:1)
好吧,我已经弄明白了这个问题。问题是我在编译器的参数中包含了modulename.h
。删除后,对main.c
或modulename.pyx
进行了任何修改。此外,并非所有这些参数都是编译器所必需的。在我的机器(Mac OS 10.9)上编译上述代码的最简单方法是:
编译:
cc -c main.c modulename.c -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
链接:
cc -L/System/Library/Frameworks/Python.framework/Versions/2.7/lib -L/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config -lpython2.7 -ldl main.o modulename.o -o main