#python
#python
Вопрос:
Я следую за книгой «Black Hat Python», и текущая деятельность заключается в создании замены netcat. Для установки параметров используется ‘getopt’. Я был смущен тем, почему o,a
используется в цикле for для проверки параметров?
if not len(sys.argv[1:]):
usage()
# read the command line options
try:
opts, args = getopt.getopt(sys.argv[1:],"hle:t:p:cu:",
["help", "listen", "execute", "target", "port", "command", "upload"])
except getopt.GetoptError as err:
print(str(err))
usage()
for o,a in opts:
if o in ("-h","--help"):
usage()
elif o in ("-l", "--listen"):
listen = True
elif o in ("-e", "--execute"):
execute = a
elif o in ("-c", "--commandshell"):
command = True
elif o in ("-u", "--upload"):
upload_destinaton = a
elif o in ("-t", "--target"):
target = a
elif o in ("-p", "--port"):
port = int(a)
else:
assert False,"Unhandled Option"
Комментарии:
1.
getopt
на самом деле он никогда не предназначался для нового кода, а служил вспомогательным средством для переноса существующих программ, которые использовалиgetopt
библиотеку. Вы должны использоватьargparse
для обработки параметров командной строки.
Ответ №1:
Если вы посмотрите на страницу документации для python getopt, там есть пример, который демонстрирует это:
>>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')] # <--- HERE
>>> args
['a1', 'a2']
opts
(в вашем вопросе) соответствует optlist
в приведенном выше примере.
getopt
возвращает список кортежей в качестве первого возвращаемого значения (и список в качестве второго), поэтому с помощью for o,a in opts
код разбивает эти кортежи на части во время каждой итерации цикла.
Ответ №2:
opts
это список пар параметров и значений. Смотрите документы:
Возвращаемое значение состоит из двух элементов: первый — это список пар (опция, значение); второй — это список аргументов программы, оставшихся после удаления списка опций (это завершающий фрагмент аргументов). Каждая возвращаемая пара параметров и значений имеет параметр в качестве первого элемента, с префиксом через дефис для коротких параметров (например, ‘-x’) или двумя дефисами для длинных параметров (например, ‘—long-option’), и аргумент option в качестве второго элемента или пустую строку, если у параметра нет аргумента. Параметры отображаются в списке в том же порядке, в котором они были найдены, что позволяет использовать их несколько раз. Длинные и короткие варианты могут быть смешаны.
Итак, цикл for обрабатывает каждый из аргументов командной строки, то есть пары option, value за раз. Количество аргументов может варьироваться по количеству.
Вас интересует что-то более конкретное?
Комментарии:
1. да, мне было интересно, почему были использованы опции ‘o’ и ‘a’. означает ли ‘o’ что-то внутри getopt?
2. Ах,
o
иa
— это произвольные имена переменных в конструкции цикла; с таким же успехом они могли бы бытьx
иy
. Важно то, чтоfor
цикл присваивает им два элемента из каждого 2-го кортежа в opts. (opts — это просто список из двух кортежей, соответствующих парам option:value, как продемонстрировал @Kingsley выше)