子类化ctypes类型

时间:2014-11-24 10:49:28

标签: python ctypes

我想知道是否可以继承各种类型的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函数的输入和输出。

1 个答案:

答案 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!'