Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用C扩展Python?_Python_C - Fatal编程技术网

如何用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驱动程序快速指南中所做的);问题中大部分细节可能被省略了。而且,我并不是说这个答案不好。只是其他工具(例如)使用例更容易。