Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prevent automatic type conversion in ctypes callback functions

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 (python3cfunctype_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)
like image 664
Matt Joiner Avatar asked Jun 08 '11 01:06

Matt Joiner


1 Answers

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
like image 189
Luke Avatar answered Oct 20 '22 06:10

Luke