Как инициализировать массив ctypes в Python из командной строки - PullRequest
0 голосов
/ 21 ноября 2018

Итак, мне было поручено написать скрипт 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 ]

0 голосов
/ 21 ноября 2018

Из вашего примера видно, что у вас есть 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)
0 голосов
/ 21 ноября 2018

Попробуйте это:

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)
...