如何使用C扩展Python?

Min*_*wth 4 c python

我一直在做很多关于这个主题的阅读,并且在我的脑子里围绕着这个需要发生的方式遇到了很多麻烦.

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

int Add(int a, int b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

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

dus*_*uff 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)
Run Code Online (Sandbox Code Playgroud)


Ada*_*eld 7

正确的方法是编写扩展模块.但是如果你做的事情很简单(例如添加两个整数)而不是独立于Python,你可以在C中编写一个常规的共享库(在Windows上是一个DLL),并使用ctypes模块加载它.

例如:

// C code
int Add(int a, int b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

像这样编译:

gcc add.c -fPIC -shared -o libadd.so
Run Code Online (Sandbox Code Playgroud)

然后在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
Run Code Online (Sandbox Code Playgroud)