我希望使用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结构体对象,它本身作为引用进行管理。一个明显的解决方法是手动复制每个字段(表示为不可变的Python int),但这在处理更复杂的结构时不具有可扩展性。此外,对于不是基本的,而是结构化类型的字段,需要进行递归处理。
我的另一个选择是使用
memmove
并将对象复制为缓冲区,但这似乎非常容易出错(由于Python是动态类型的,因此很容易将其与不同类型和大小的对象一起使用,导致内存损坏或分段错误)...有什么建议吗?
编辑:
我也可以使用全新的结构体副本,所以这可能会有用:
import copy
p0 = Point()
p1 = copy.deepcopy(p0) #or just a shallow copy for this example
但我不确定是否存在一些奇怪的行为,将ctypes代理复制为常规Python对象...
deepcopy
会失败:ValueError: ctypes objects containing pointers cannot be pickled
。 - 101