如何从命令行初始化 Python 中的 ctypes 数组

How to initialize a ctypes array in Python from command line

所以我的任务是编写一个 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 的新手,发现用其他语言完成我认为简单的任务相当困难(不是抨击该语言,只是觉得它不像其他语言那样直观地完成此类任务)。

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

我搜索了又搜索,但没有找到解决我问题的方法。

所有正面和负面评论总是受到赞赏,两者都将永远作为一种学习经验:)

试试这个:

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)

从你的例子看来你有 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)