When wrapping Python functions with a CFUNCTYPE
type, I've found that the non-pointer types are automatically converted as though their value
attribute was called.
How can I suppress this automatic conversion?
from ctypes import *
funcspec = CFUNCTYPE(c_int, c_int, POINTER(c_int))
@funcspec
def callback(the_int, the_int_p):
print(vars())
return 3
print(callback(c_int(1), byref(c_int(2))))
Which produces (python3
cfunctype_type_conversion.py
):
{'the_int': 1, 'the_int_p': <__main__.LP_c_int object at 0x2671830>}
3
I'd like:
{'the_int': c_int(1), 'the_int_p': <__main__.LP_c_int object at 0x2671830>}
c_int(3)
This is a bit of a hack, but it might work for you. Hopefully someone else will chime in with a cleaner way..
from ctypes import *
class c_int_hack(c_int):
def from_param(self, *args):
return self
funcspec = CFUNCTYPE(c_int, c_int_hack, POINTER(c_int))
@funcspec
def callback(the_int, the_int_p):
print(vars())
print(the_int.value)
return 3
print(callback(c_int(1), byref(c_int(2))))
..and the output is:
{'the_int': <c_int_hack object at 0xb7478b6c>, 'the_int_p': <__main__.LP_c_long object at 0xb747892c>}
1
3
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With