所以我的任务是编写一个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完全陌生,发现用其他语言来完成我认为简单的任务相当困难(不要轻视该语言,只是发现它无法像其他语言那样直观地执行此类任务)。
那么,有没有一种方法可以简化该数组的初始化,而该数组本身可能会有可变数量的条目?
我已经搜索了,但没有发现能解决我的问题。
所有肯定和否定的评论都会受到赞赏,并且两者都将始终作为学习经验:)
答案 0 :(得分:1)
尝试一下:
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)
答案 1 :(得分: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)