在Python中使用 C 代码的问题 |设置 1
先决条件:在Python中使用 C 代码 |第 1 组,第 2 组
问题 #1:如果使用ctypes则存在一个问题,即原始 C 代码可能使用无法完全映射到Python的语言。
让我们以divide()
函数为例,因为它通过其中一个参数返回一个值。这是一种常见的 C 技术,但通常不清楚它应该如何在Python中工作。
divide = _mod.divide
divide.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int))
x = 0
divide(10, 3, x)
输出 :
Traceback (most recent call last):
File "", line 1, in
ctypes.ArgumentError: argument 3: : expected LP_c_int
instance instead of int
问题 #2:
即使它有效,也违反了 Python 的整数不变性。对于涉及指针的参数,必须构造一个兼容的ctypes对象并按照下面给定的代码传递。
x = ctypes.c_int()
print ("divide(10, 3, x) : ", divide(10, 3, x))
print ("x.value : ", x.value)
输出 :
divide(10, 3, x) : 3
x.value : 1
问题 #3:
在下面的代码中,创建了一个ctypes.c_int的实例,并作为指针对象传入。c_int对象与普通的Python整数不同,可以进行变异。要检索或更改值,可以使用.value属性。
# int divide(int, int, int *)
_divide = _mod.divide
_divide.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int))
_divide.restype = ctypes.c_int
def divide(x, y):
rem = ctypes.c_int()
quot = _divide(x, y, rem)
return quot, rem.value
问题 #4: avg()
函数是一个挑战。
底层 C 代码需要一个表示数组的长度并接收一个指针。然而,从Python的角度来看, Python的“数组”可以采用多种不同的形式,它可以是数组、列表、元组或 numpy 数组,也许您希望支持多种可能性。