2015-05-22 2 views
0

Есть ли способ разобрать ограниченное количество переключателей в функции с помощью argparse? Скажем, моя команда:Разбор ограниченных переключателей с python argparse

python sample.py -t abc -r dfg -h klm -n -p qui 

И я хочу, чтобы разобрать argparse от -t до -h и оставить остальные, также показывают помощь для них только. Далее я хочу разобрать любой переключатель после -h в другую функцию и увидеть соответствующую помощь там.

Возможно ли такое поведение в argparse? Также есть способ, которым я могу изменить sys.arg, который он использует внутри? Спасибо.

+0

Вы можете дать 'parse_args' любой список строк' argv'. Например, 'parse_args (sys.argv [1: 5])' – hpaulj

ответ

2
python sample.py -t abc -r dfg -h klm -n -p qui 

И я хочу, чтобы разобрать argparse от -t до -h и оставить остальные, также показывают помощь для них только. Затем я хочу разобрать любой переключатель после -h в другую функцию и увидеть соответствующую помощь там.

Есть некоторые проблемы с вашей спецификации:

-h Является ли регулярная помощь? Если это так, он имеет приоритет, создавая help без разбора других аргументов. Строка после -h предполагает, что вы рассматриваете ее как обычный пользовательский аргумент, который затем потребует инициирования анализатора с выключенной помощью. Но тогда как бы вы попросили help?

Что устанавливает разрыв между двумя разборами/помощью? Количество аргументов, флаг -h (независимо от порядка) или идентификатор флагов. Помните, что argparse принимает помеченные аргументы в любом порядке.

Вы можете определить один синтаксический анализатор, который знает о -t и -r, а другой, который обрабатывает -n и -p. Вызов каждого из parse_known_args позволяет работать без повышения ошибки unknown argument.

Вы также можете изменить sys.argv. parse_args (и известный вариант) принимает необязательный аргумент argv. Если это не так, то он использует sys.argv[1:]. Таким образом, вы можете либо самому изменить sys.argv (удаление элементов), либо вы можете передать подмножество sys.argv в парсер.

parser1.parse_known_args(sys.argv[1:5]) 
parser2.parse_known_args(['-n','one','-o','two']) 
parser3.parse_args(sys.argv[3:]) 

Играйте с этими идеями и возвращайтесь к нам, если есть дополнительные вопросы.

1

Вы всегда можете изменить sys.args и поместить туда что пожелаете.

Что касается вашего основного вопроса, вы можете иметь два парсера. Один из них будет иметь аргументы -t - -h, второй -n и -p. Затем вы можете использовать метод argparseparse_known_args() для каждого анализатора, который будет анализировать только аргументы, определенные для каждого из них.