ctype C library call always returns 0 with Python3

Hans Mulder hansmu at xs4all.nl
Sat May 19 12:23:36 EDT 2012


On 19/05/12 13:20:24, Nobody wrote:
> On Sat, 19 May 2012 11:30:46 +0200, Johannes Bauer wrote:
> 
>> import ctypes
>> libc = ctypes.cdll.LoadLibrary("/lib64/libc-2.14.1.so")
>> print(libc.strchr("abcdef", ord("d")))
> 
> In 3.x, a string will be passed as a wchar_t*, not a char*. IOW, the
> memory pointed to by the first argument to strchr() will consist mostly of
> NUL bytes.
> 
> Either use a "bytes" instead of a string:
> 
> 	> print(libc.strchr(b"abcdef", ord("d")))
> 	1984444291
> 
> or specify the argument types to force a conversion:
> 
> 	> libc.strchr.argtypes = [c_char_p, c_int]
> 	> print(libc.strchr("abcdef", ord("d")))
> 	1984755787

You'll also want to specify the return type:

>>> libc.strchr.argtypes = [c_char_p, c_int]
>>> print(libc.strchr(b"abcdef", ord("d")))
7224211
>>> libc.strchr.restype = c_char_p
>>> print(libc.strchr(b"abcdef", ord("d")))
b'def'

Hope this helps,

-- HansM




More information about the Python-list mailing list