gpt4 book ai didi

pointers - Python ctypes : copying Structure's contents

转载 作者:太空狗 更新时间:2023-10-29 20:17:42 24 4
gpt4 key购买 nike

我想用 ctypes 在 Python 中模拟一段 C 代码,代码是这样的:

typedef struct {
int x;
int y;
} point;

void copy_point(point *a, point *b) {
*a = *b;
}

在 ctypes 中,无法执行以下操作:

from ctypes import *

class Point(Structure):
_fields_ = [("x", c_int),("y", c_int)]

def copy_point(a, b):
a.contents = b.contents

p0 = pointer(Point())
p1 = pointer(Point())
copy_point(p0,p1)

因为 contents 仍然是一个 Python ctypes Structure 对象,它本身作为引用进行管理。

一个明显的解决方法是手动复制每个字段(表示为不可变的 python int),但这不能扩展到更复杂的结构。此外,对于非基本类型但结构化类型的字段,需要递归完成。

我的另一个选择是使用 memmove 并复制对象,就好像它们是缓冲区一样,但这似乎很容易出错(因为 Python 是动态类型的,将它与对象一起使用太容易了不同的类型和大小,导致内存损坏或段错误)...

有什么建议吗?

编辑:

我还可以使用该结构的全新副本,所以这可能会有用:

import copy
p0 = Point()
p1 = copy.deepcopy(p0) #or just a shallow copy for this example

但我不知道是否可能存在某种奇怪的行为,将 ctypes 代理复制为常规 Python 对象......

最佳答案

您可以使用序列分配来复制指向的对象(而不是分配给 p.contents,这会更改指针值):

def copy(dst, src):
"""Copies the contents of src to dst"""
pointer(dst)[0] = src

# alternately
def new_copy(src):
"""Returns a new ctypes object which is a bitwise copy of an existing one"""
dst = type(src)()
pointer(dst)[0] = src
return dst

# or if using pointers
def ptr_copy(dst_ptr, src_ptr):
dst_ptr[0] = src_ptr[0]

ctypes 将为您进行类型检查(这不是万无一失的,但总比没有好)。

使用示例,并验证它确实有效;):

>>> o1 = Point(1, 1)
>>> o2 = Point(2, 2)
>>> print (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(1, 1, 6474004) (2, 2, 6473524)
>>> copy(o2, o1)
>>> pprint (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(1, 1, 6474004) (1, 1, 6473524)

>>> o1 = Point(1, 1), o2 = Point(2, 2)
>>> print (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(1, 1, 6473844) (2, 2, 6473684)
>>> p1, p2 = pointer(o1), pointer(o2)
>>> addressof(p1.contents), addressof(p2.contents)
(6473844, 6473684)
>>> ptr_copy(p1, p2)
>>> print (o1.x, o1.y, addressof(o1)), (o2.x, o2.y, addressof(o2))
(2, 2, 6473844) (2, 2, 6473684)
>>> addressof(p1.contents), addressof(p2.contents)
(6473844, 6473684)

关于pointers - Python ctypes : copying Structure's contents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1470343/

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