【问题标题】:How to initialize a ctypes array in Python from command line如何从命令行在 Python 中初始化 ctypes 数组
【发布时间】:2018-11-21 00:54:57
【问题描述】:

因此,我的任务是编写一个 Python 脚本,该脚本访问 Win 32 DLL 以执行某些功能。该脚本需要从命令行接受参数,然后输出其他参数。

我正在使用 ctypes,因为它是我发现将参数传递给 Win 32 DLL 方法的最简单方法,但我很幸运能够从命令行获得一个固定的值数组,我通过这样做解决了这个问题:

seed = (ctypes.c_ubyte * 12)(
    ctypes.c_ubyte(int(sys.argv[3], 16)), ctypes.c_ubyte(int(sys.argv[4], 16)),
    ctypes.c_ubyte(int(sys.argv[5], 16)), ctypes.c_ubyte(int(sys.argv[6], 16)),
    ctypes.c_ubyte(int(sys.argv[7], 16)), ctypes.c_ubyte(int(sys.argv[8], 16)),
    ctypes.c_ubyte(int(sys.argv[9], 16)), ctypes.c_ubyte(int(sys.argv[10], 16)),
    ctypes.c_ubyte(int(sys.argv[11], 16)), ctypes.c_ubyte(int(sys.argv[12], 16)),
    ctypes.c_ubyte(int(sys.argv[13], 16)), ctypes.c_ubyte(int(sys.argv[14], 16))
)

但这无论如何都不是动态的,我尝试在数组初始化中使用 for 循环执行此数组初始化,但没有成功。

我对 Python 完全陌生,发现用其他语言完成我认为简单的任务相当困难(不是抨击该语言,只是觉得它不像其他语言那样直观)。

那么,有没有一种方法可以简化这个数组的初始化,因为它本身可能存在可变数量的条目?

我已经搜索和搜索,但没有找到解决我的问题。

所有正面和负面的 cmets 都会受到赞赏,并且两者都将始终作为学习经验 :)

【问题讨论】:

    标签: python ctypes python-2.5


    【解决方案1】:

    从您的示例看来,您有 14 个参数,最后 12 个是十六进制字节。

    import ctypes
    import sys
    
    # Convert parameters 3-14 from hexadecimal strings to integers using a list comprehension.
    L = [int(i,16) for i in sys.argv[3:15]]
    
    # Initialize a byte array with those 12 parameters.
    # *L passes each element of L as a separate parameter.
    seed = (ctypes.c_ubyte * 12)(*L)
    

    【讨论】:

    • 感谢您的解决方案,我选择它作为答案是因为它更像是匿名方法,并且只花了两行代码:) 再次感谢您抽出宝贵时间回答,非常感谢!
    【解决方案2】:

    试试这个:

    seed_list = []                   
    for i in sys.argv[3:]:
        seed_list.append(ctypes.c_ubyte(int(i, 16)))
    seed = (ctypes.c_ubyte * len(seed_list))(*seed_list)
    

    【讨论】:

    • 我希望我可以选择这两个响应作为解决方案,因为它们都按预期工作。感谢您的解决方案。
    • 但这确实允许我初始化一个大数组,而代码少得多,再次感谢!
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多