我想知道是否可以继承各种类型的ctypes。我试着写一个简单的例子,但有一件(或两件)我不理解的事情。
from ctypes import *
class my_c_int(c_int):
pass
# def __new__(*args):
# print "Hello from __new__" # why is this not called?
libc = cdll.LoadLibrary("libc.dylib")
printf = libc.printf
# printf.restype = c_int # prints "14"
printf.restype = my_c_int # prints "<my_c_int object at 0x...>"
print printf("Hello, %s\n", "World!")
为什么不my_c_int
返回与原始c_int
相同的类型,即int
?有可能这样做吗?如果我写print printf(...).value
它就有效。是否可以自动为.value
?
my_c_int
PS:顺便说一下,为什么没有调用__new__
方法?
修改
从文档中考虑另一个例子:
from ctypes import *
libc = cdll.LoadLibrary("libc.dylib")
IntArray5 = c_int * 5
ia = IntArray5(5, 1, 7, 33, 99)
qsort = libc.qsort
qsort.restype = None
CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))
def py_cmp_func(a, b):
print "py_cmp_func", a[0], b[0]
return a[0] - b[0]
cmp_func = CMPFUNC(py_cmp_func)
qsort(ia, len(ia), sizeof(c_int), cmp_func)
好的,这很有效。我的问题是:是否可以修改CMPFUNC
函数收到的参数?是否可以通过使用一些自定义/子类型的ctypes类型来实现?
例如,假设我想直接传递给py_cmp_func
整数(而不是指针)。我能做到:
from ctypes import *
libc = cdll.LoadLibrary("libc.dylib")
IntArray5 = c_int * 5
ia = IntArray5(5, 1, 7, 33, 99)
qsort = libc.qsort
qsort.restype = None
CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))
def auxiliary(a, b):
return py_cmp_func(a[0], b[0])
def py_cmp_func(a, b):
print "py_cmp_func", a, b
return a - b
cmp_func = CMPFUNC(auxiliary)
qsort(ia, len(ia), sizeof(c_int), cmp_func)
这也有效,但这不是我追求的。没有auxiliary
函数可以有这种行为吗?有点像:
from ctypes import *
libc = cdll.LoadLibrary("libc.dylib")
IntArray5 = c_int * 5
ia = IntArray5(5, 1, 7, 33, 99)
qsort = libc.qsort
qsort.restype = None
class my_int_pointer(object):
@classmethod
def from_param(cls, obj): # not sure it `from_param` is the right place
# in any case, it will not be called, anyway...
return cast(obj, POINTER(c_int))[0]
CMPFUNC = CFUNCTYPE(c_int, my_int_pointer, POINTER(c_int))
def py_cmp_func(a, b):
print "py_cmp_func", a, b[0]
return a - b[0]
cmp_func = CMPFUNC(py_cmp_func)
qsort(ia, len(ia), sizeof(c_int), cmp_func)
但这不起作用。
简而言之,我想知道如何自定义ctypes函数的输入和输出。
答案 0 :(得分:0)
不是一个完整的答案,但这段代码适用于我使用Python 2.7.6:
from ctypes import *
class my_c_int(c_int):
def __new__(*args):
print 'new!'
my_c_int() # prints 'new!'