如何用C扩展Python?
关于这个问题,我已经读了很多书,我在思考如何实现这一点上遇到了很多困难 我想做的是有一个函数:如何用C扩展Python?,python,c,Python,C,关于这个问题,我已经读了很多书,我在思考如何实现这一点上遇到了很多困难 我想做的是有一个函数: int Add(int a, int b) { return a + b; } 并且能够从我的Python脚本中调用它。我该怎么做 有几种方法可以做到这一点。经典的Python C API有点复杂,但它是所有Python的源代码。您可以从以下内容开始:。您尝试过吗?它允许您使用类似python的语法进行编写,然后将其编译为C扩展模块 这个模块应该可以让您轻松入门,并且有很多真实的示例。到目前为止,最
int Add(int a, int b) { return a + b; }
并且能够从我的Python脚本中调用它。我该怎么做 有几种方法可以做到这一点。经典的Python C API有点复杂,但它是所有Python的源代码。您可以从以下内容开始:。您尝试过吗?它允许您使用类似python的语法进行编写,然后将其编译为C扩展模块
这个模块应该可以让您轻松入门,并且有很多真实的示例。到目前为止,最简单的方法是使用该模块,它允许您直接从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)
正确的方法是去做。但是如果您正在做一些简单的事情(比如添加两个整数),而不是独立于Python来完成,那么您可以用C编写一个常规的共享库(在Windows上是一个DLL),然后使用
例如:
// C code
int Add(int a, int b) { return a + b; }
这样编译:
gcc add.c -fPIC -shared -o libadd.so
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
然后在Python中使用它,如下所示:
gcc add.c -fPIC -shared -o libadd.so
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
如果您只想用C实现部分代码,我建议您使用。例如,您可以这样编写
Add
函数:
cpdef int Add(int x, int y):
return x+y
然后使用cython将其编译成一个模块,您可以将其导入到代码中。阅读本分步教程;它回答了你的问题吗?有关ctypes,请参见ctypes:+1。这是我对c扩展的默认选择,除非其他考虑因素驱动了其他选项之一。如果您计划在PyPy上运行代码,ctypes也是一个不错的选择。这对于提高性能很酷,但不会帮助您使用Python中现有的c代码。(OP从未声明他希望这样做)。你错了;您可以围绕现有的C代码创建pythonicpyrex包装(这正是CUPS驱动程序快速指南中所做的);问题中大部分细节可能被省略了。而且,我并不是说这个答案不好。只是其他工具(例如)使用例更容易。