在pycharm中进行开发时,下面的代码有时会失败(转换结构的内容会发生变化),当我运行coverage单元测试时,而不是当它作为单元测试运行时。以下是代码的相关部分:
class SomeStruct(ctypes.Structure):
_fields_ = [
('field', ctypes.c_char)
]
res = bytearray(b'12345')
ctypes.cast(bytes(res), ctypes.POINTER(SomeStruct)).contents
但是以下内容始终有效:
class SomeStruct(ctypes.Structure):
_fields_ = [
('field', ctypes.c_char)
]
res = bytearray(b'12345')
res_bytes = bytes(res)
ctypes.cast(res_bytes, ctypes.POINTER(SomeStruct)).contents
在我看来,这似乎是一些引用计数问题,但我不确定。为什么会出现这个问题?在ctypes中转换bytearray实例的正确方法是什么?
python版本是3.4.0,x64。
答案 0 :(得分:3)
以下答案有助于: Python ctypes structure being overwritten when allocating more memory
class SomeStruct(ctypes.Structure):
_fields_ = [
('field', ctypes.c_char)
]
res = bytearray(b'12345')
ctypes.cast(ctypes.create_string_buffer(bytes(res)), ctypes.POINTER(SomeStruct)).contents