如何在Python中使用命令行初始化一个ctypes数组

3

我被委托编写一个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中执行我认为其他语言中简单的任务相当困难(不是贬低这门语言,只是觉得对于这些任务而言不如其他语言直观易懂)。
那么,有没有一种方法可以简化初始化数组的过程,其中可以有可变数量的条目?
我已经搜索了很多资料,但是没有找到解决我的问题的方法。
欢迎各位给出积极或者消极的评论,我们都会从中汲取教训 :)
2个回答

5

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

谢谢你的解决方案,我选择它作为答案,因为它更像匿名方法,并且只需要两行代码 :) 再次感谢你抽出时间来回答,非常感激! - CCS

3

试试这个:

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)

我希望我能选中两个回答作为解决方案,因为它们都按预期工作。谢谢你的解决方案。 - CCS
但这确实让我用更少的代码初始化了一个大数组,再次感谢! - CCS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接