在 Python 中动态定义/更新 ctypes 结构

加汗

我在 ctypes 中创建了子结构和结构,如下所示,我在结构内定义了一个具有一些预定义大小的子结构数组。(根据要求SIZE0最初可以设置为,并且可以根据用户输入而变化)。

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)),
    ]

我的目标是根据用户输入修改这个子结构。

为了达到同样的目的,我尝试了以下选项但没有成功:

  1. 初始化实例时定义__init__方法和更新_fields_

  2. _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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章