我想模仿一塊在Python的C代碼的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
仍然是一個Python ctypes結構對象,它作爲一個引用自身進行管理。
一個顯而易見的解決方法是手動複製每個字段(表示爲不可變的python int),但不能用更復雜的結構進行擴展。此外,它需要遞歸完成不是基本的,但結構化類型的字段。
我的其他選擇是使用memmove
並將對象複製爲緩衝區,但似乎非常容易出錯(因爲Python是動態類型的,所以它很容易與不同類型和大小的對象一起使用,導致到內存損壞或分段錯誤)...
有什麼建議嗎?
編輯:
我還可以使用該結構的一個全新的副本,所以也許這可能是有用的:
import copy
p0 = Point()
p1 = copy.deepcopy(p0) #or just a shallow copy for this example
,但我不知道是否有可能是某種離奇的行爲複製的ctypes proxys,好像他們是常規的Python對象...
不幸'deepcopy'失敗如果ctypes的結構包含指針:'ValueError異常:ctypes的包含指針對象不能被pickled'。 – 101 2015-04-02 00:18:03