Python ctypes中_fields_报错但_field_可行的原因咨询
问题原因解析
核心结论
ctypes没有官方支持的_field_属性,你用单数_field_时根本没有创建真正的ctypes结构体,只是给普通Python类加了个自定义属性;而_fields_是ctypes官方规定的结构体字段定义属性,赋值报错是因为类型不匹配。
详细拆解
_fields_的正确作用_fields_是ctypes文档明确规定的、用来定义C结构体字段的属性。当你用它定义结构体时,ctypes会根据你指定的字段类型(比如c_char_p、c_char * 2等)生成对应的内存布局,并且会严格校验赋值的类型是否匹配。
你赋值'bx'(Python字符串)触发TypeError,大概率是因为字段类型定义和赋值类型不匹配:- 如果字段定义的是
c_char数组(比如('Data_string', c_char * 2)),需要传入bytes类型(比如b'bx'),而不是Python字符串; - 如果定义的是
c_char_p,直接传字符串也会因为类型不兼容报错。
- 如果字段定义的是
_field_的本质
当你用单数_field_时,ctypes完全不会识别这个属性——它只是你给类添加的一个普通自定义属性,和ctypes的结构体逻辑无关。此时你给Data_string赋值'bx',只是在给普通Python类的属性赋值,Python本身对普通属性的类型没有强制限制,所以不会报错,但这根本不是真正的ctypes结构体,无法实现和C结构体的内存交互。
正确示例
如果要定义一个能存储b'bx'的结构体,应该用_fields_并匹配正确类型:
from ctypes import Structure, c_char class TestStruct(Structure): _fields_ = [ ('Data_string', c_char * 2) ] obj = TestStruct() obj.Data_string = b'bx' # 用bytes类型赋值,正常运行
内容的提问来源于stack exchange,提问作者NormalToad
相关产品推荐
相关产品推荐

