python - 使用 cython 从 c 调用 python 代码

标签 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 文件很好地编译为 c,它生成 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 代码。

最佳答案

好的,我已经弄清楚了这个问题。问题是我在编译器的参数中包含了 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 模块名.o -o main

关于python - 使用 cython 从 c 调用 python 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22445179/

相关文章:

python - 基于MultiColumn二级的圆柱

python - 如何在 Firefox Webdriver 中永久设置代理

c - 字符串中存在多个单词 C

c - 我的电脑认为 signed int 比 -1 小?

python - 使用 Cython 时如何将一个 C++ 类(引用)传递给另一个类?

c++ - 如何通过串行 w/Arduino 将动态文本写入 LED 显示屏

python - 将字符串切成 3 组并重叠

c - 帮助使此代码针对 SPOJ 运行得更快

python - 如何将 PyObject* 指针设置为 None?

multithreading - Cython:使 prange 并行化线程安全