我在 ctypes 中创建了子结构和结构,如下所示,我在结构内定义了一个具有一些预定义大小的子结构数组。(根据要求SIZE
,0
最初可以设置为,并且可以根据用户输入而变化)。
from ctypes import *
class MySubStructure(Structure):
_fields_ = [
("sub_field1", c_uint32),
("sub_field2", c_uint32)
]
class MyStructure(Structure):
SIZE = 2
_fields_ = [
("field1", c_uint32),
("field2", c_uint32),
("sub_structure_field", ARRAY(SubStructure, SIZE)),
]
我的目标是根据用户输入修改这个子结构。
为了达到同样的目的,我尝试了以下选项但没有成功:
初始化实例时定义__init__
方法和更新_fields_
_fields_
初始化实例后更新
对于我尝试附加的这两个选项sub_structure_field
,通过访问 index.html 仅更新大小值。
最后,我只想要一个解决方法,以便我可以在另一个结构中使用结构数组,要么在运行时初始化,要么在运行时修改。
提到[Python 3.Docs]: ctypes - Python 的外部函数库。
在定义_fields_ 时必须知道数组大小。
你可以有一个工厂函数来定义类并返回它。
脚本0.py:
#!/usr/bin/env python3
import sys
import ctypes
class SubStructure(ctypes.Structure):
_fields_ = [
("sub_field1", ctypes.c_uint32),
("sub_field2", ctypes.c_uint32),
]
def structure_factory(size):
class DynamicStructure(ctypes.Structure):
_fields_ = [
("field1", ctypes.c_uint32),
("field2", ctypes.c_uint32),
("sub_structure_field", ctypes.ARRAY(SubStructure, size)), # 2nd element equivalent to SubStructure * size
]
return DynamicStructure
def main():
Struct2 = structure_factory(2)
Struct5 = structure_factory(5)
print(Struct2.sub_structure_field)
print(Struct5.sub_structure_field)
if __name__ == "__main__":
print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
main()
print("\nDone.")
输出:
[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057417435]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" script0.py Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32 <Field type=SubStructure_Array_2, ofs=8, size=16> <Field type=SubStructure_Array_5, ofs=8, size=40> Done.
你也可以看看[SO]: Setting _fields_ dynamic in ctypes.Structure (@CristiFati's answer)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句