я хочу, чтобы имитировать кусок кода C в Python с ctypes, код что-то вроде:Python ctypes: процесс копирования содержимого структуры в
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
все еще является элементом типа Cython Python, который управляется как сама ссылка.
Очевидным обходным путем было бы вручную скопировать каждое поле (которое представлено как неизменяемое значение python int), но это не масштабируется с более сложными структурами. Кроме того, это нужно сделать рекурсивно для полей, которые не являются базовыми, но структурированными типами.
Моим другим вариантом является использование memmove
и копирование объектов, как если бы они были буферами, но это кажется очень подверженным ошибкам (поскольку Python динамически вводится, было бы слишком легко использовать его с объектами различного типа и размера, к повреждениям памяти или сегментации) ...
Любые предложения?
Edit:
Я мог бы также использовать свежую копию структуры, так что, возможно, это может быть полезно:
import copy
p0 = Point()
p1 = copy.deepcopy(p0) #or just a shallow copy for this example
, но я не знаю, что может быть каким-то причудливое поведение копирование ctypes Proxys, как если бы они были обычные объекты Python ...
К сожалению, 'deepcopy' терпит неудачу, если структура ctypes содержит указатели:' ValueError: объекты ctypes, содержащие указатели, не могут быть маринованными'. – 101