gpt4 book ai didi

python - 子类化 ctypes 类型

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:07 24 4
gpt4 key购买 nike

我想知道是否可以将各种类型的 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 它会起作用。是否可以为 my_c_int 自动返回 .value

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 函数的输入和输出。

最佳答案

不是一个完整的答案,但这段代码对我使用 Python 2.7.6 有效:

from ctypes import *
class my_c_int(c_int):
def __new__(*args):
print 'new!'
my_c_int() # prints 'new!'

关于python - 子类化 ctypes 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27103037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com