gpt4 book ai didi

Python:ctypes 指向局部变量的指针;如何确保他们不被释放?

转载 作者:太空宇宙 更新时间:2023-11-03 19:29:10 25 4
gpt4 key购买 nike

我有一些与此有些类似的代码:

def castArgToCtype(arg, ctyp):
if issubclass(ctyp, _ctypes._Pointer): return createPtr(arg, ctyp)
return ctyp(arg)

def createPtr(arg, ctyp):
assert isinstance(arg, (list,tuple))
assert issubclass(ctyp, _ctypes._Pointer)
o = (ctyp._type_ * (len(arg) + 1))()
for i in xrange(len(arg)):
o[i] = castArgToCtype(arg[i], ctyp._type_)
op = ctypes.cast(ctypes.addressof(o), ctyp)
# TODO: what when 'o' goes out of scope and freed?
return op

我将其称为createPtr((1,2,3), ctypes.POINTER(ctypes.c_int))

如何确保只要 op 未释放,我在那里创建的 ctpes 数组 o 也不会被释放?

我已经看到属性op._objects,它甚至似乎是用于此目的,但它是只读的。

最佳答案

这似乎有效:

import ctypes, _ctypes

def castArgToCtype(arg, ctyp):
if issubclass(ctyp, _ctypes._Pointer): return createPtr(arg, ctyp)
return ctyp(arg)

def createPtr(arg, ctyp):
assert isinstance(arg, (list,tuple))
assert issubclass(ctyp, _ctypes._Pointer)
o = (ctyp._type_ * (len(arg) + 1))()
for i in xrange(len(arg)):
o[i] = castArgToCtype(arg[i], ctyp._type_)
op = ctypes.pointer(o)
op = ctypes.cast(op, ctyp)
return op

a = createPtr((1,2,3), ctypes.POINTER(ctypes.c_int))
print a, a[0], a[1], a[2], a._objects

输出:

<__main__.LP_c_int object at 0x105dc6680> 1 2 3 {'1': <__main__.c_int_Array_4 object at 0x105dc6560>, '0': {}, 4393297392: <__main__.LP_c_int_Array_4 object at 0x105dc65f0>}

关于Python:ctypes 指向局部变量的指针;如何确保他们不被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6800664/

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