如何使用C扩展Python?

时间:2011-08-05 18:49:13

标签: python c

我一直在阅读很多关于这个主题的内容,并且在我的脑子里围绕如何发生这种情况时遇到了很多麻烦。

我想要做的是有一个功能:

int Add(int a, int b) { return a + b; }

并且能够从我的Python脚本中调用它。我该怎么做呢?

5 个答案:

答案 0 :(得分:9)

到目前为止最简单的方法是使用ctypes模块,它允许您直接从Python调用C库中的函数。将C函数编译为库后,可以编写以下内容:

# Load ctypes, and your library
from ctypes import *
mylib = CDLL("mylibrary.so")

# Declare the function's prototype. This isn't strictly required.
mylib.Add.argtypes = [c_int, c_int]
mylib.Add.restype = c_int

# Call it!
result = mylib.Add(123, 456)

答案 1 :(得分:7)

正确的方法是write an extension module。但是如果你正在做一些简单的事情(例如添加两个整数),而不是独立于Python,你可以在C中编写一个常规的共享库(在Windows上是一个DLL),并使用{{{}加载它。 3}}

例如:

// C code
int Add(int a, int b) { return a + b; }

像这样编译:

gcc add.c -fPIC -shared -o libadd.so

然后在Python中使用它:

import ctypes
libadd = ctypes.cdll.LoadLibrary('libadd.so')
libadd.Add.argtypes = [ctypes.c_int, ctypes.c_int]
libadd.Add.restype = ctypes.c_int

print libadd.Add(42, 1)  # Prints 43

答案 2 :(得分:2)

有几种方法可以解决这个问题。经典的Python C API有点复杂,但它是所有Python的源代码。您可以开始使用:A Whirlwind Excursion through Python C Extensions

答案 3 :(得分:2)

你试过pyrex吗?它允许您使用类似python的语法编写,然后将其编译为C扩展模块。

quick-quide应该让您轻松上手,充满了真实世界的例子。

答案 4 :(得分:2)

如果您只想在C中实现部分代码,我建议您使用cython。例如,您可以像这样编写Add函数:

cpdef int Add(int x, int y):
    return x+y

然后使用cython将其编译成可导入代码的模块。