使用cython从c调用python代码

时间:2014-03-17 00:45:35

标签: python c cython

我试图从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.cmodulename.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代码的示例代码的指针。

1 个答案:

答案 0 :(得分:1)

好吧,我已经弄明白了这个问题。问题是我在编译器的参数中包含了modulename.h。删除后,对main.cmodulename.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