Open In App

Issues with using C code in Python | Set 1

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Prerequisite: Using C codes in Python | Set 1, Set 2

Issue #1 : If using ctypes then there is a problem that the original C code may use language that don’t map cleanly to Python.

Let’s take the example of divide() function as it returns a value through one of its arguments. It is a common C technique but it is often not clear how it is supposed to work in Python.




divide = _mod.divide
divide.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int))
x = 0
divide(10, 3, x)


Output :

Traceback (most recent call last):
  File "", line 1, in 
ctypes.ArgumentError: argument 3: : expected LP_c_int
instance instead of int

 
Issue #2 :
Even if it works, then there is a violation of Python’s immutability of integers. For arguments involving pointers, a compatible ctypes object has to be constructed and is pass as in the given code below.




x = ctypes.c_int()
print ("divide(10, 3, x) : ", divide(10, 3, x))
  
print ("x.value : ", x.value)


Output :

divide(10, 3, x) : 3

x.value : 1

 

Issue #3 :

In the code below, an instance of a ctypes.c_int is created and is passed in as the pointer object .c_int object can be mutated unlike a normal Python integer. To either retrieve or change the value, .value attribute can be used.




# 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


 
Issue #4 : The avg() function is a challenge.

The underlying C code expects a length representing an array and to receive a pointer. However, from the Python side in practice, a Python “array” can take many different forms, it can be array, list, tuple or numpy array and maybe you would like to support multiple possibilities.



Last Updated : 20 Mar, 2019
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads