ctypes from_param() truncating 64 bit pointers to 32 bit
Joakim Hove
joakim.hove at gmail.com
Fri Feb 18 05:10:35 EST 2011
> Ok, then take care to post proper code next time. Details can be important,
> especially when asking about non-obvious problems.
Point taken - however the original context where the problem arose
consists of several massive libraries, which would be quite
impractical to post on a forum. The code I did post was proper in the
sense that it compiles and demonstrates the problem.
> Hmm, so you think that to call a C function, ctypes doesn't need to know
> what the exact signature is? That sounds a bit naive to me.
I fully agree that ctypes needs to know the type signature of the C
functions it wishes to call, my point is that this particular
information is not present in the shared library, and for that reason
we must set the input / return attributes of the ctypes functions
manually. In the Python code I do this like:
class BugTest:
....
def from_param(self):
return self.c_ptr
def __init__(self)
self.c_ptr =
lib_handle = ctypes.CDLL( "lib.so" )
...
func = getattr( lib_handle , "print_addr")
# Set the return type:
func.restype = None
# Set the types of the arguments:
func.argtypes = [ BugTest ]
Now - the point is that if I omit the ctypes method from_param() and
instead set the argtype as:
func.argtypes = [ ctypes.c_void_p ]
And manually passing the internalized C - pointer to C things work as
I expect; I believe that the problem is somewhere along the
from_param() function path.
I did not make it really clear that if the original C allocation
points to memory in "32 bit region" everything works fine (as I
expected).
Thank you for your time.
Joakim
More information about the Python-list
mailing list