📜  在Python中使用 C 代码的问题 |设置 1

📅  最后修改于: 2022-05-13 01:54:32.106000             🧑  作者: Mango

在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 数组,也许您希望支持多种可能性。