как использовать модуль argparser в python для создания сложной команды - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь создать python программу, которая имеет сложный анализатор аргументов. программа (пусть называется MyProg) должна работать следующим образом:

1-MyProg будет принимать некоторые файлы в качестве входных данных, поэтому я использовал флаг -f в главном анализаторе (это уже subparser, поэтому я не могу использовать subparser).

2 - программа имеет 2 аргумента ( -a и -s ), которые должны присутствовать вместе, и один из них требуется, поэтому я использовал группу взаимоисключения.

3- -a должен иметь аргумент -k , поэтому я поставил - k один в нормальной группе внутри группы взаимного исключения, я сделал 2-й шаг и сделал его ( -k ) обязательным аргументом.

4 - проблема в том, что -s аргументу нужен либо -k , либо другой - e аргумент (не оба), поэтому я не знаю, где поставить этот -e аргумент, поэтому не может быть с -a или с -k .

с кодом:


description = "Prog"
# Initialize parser
parser = argparse.ArgumentParser(description=description,)

subparsers = parser.add_subparsers(required=True)

parser_MyProg = subparsers.add_parser('MyProg')


group_mut = parser_MyProg.add_mutually_exclusive_group()

group_k = group_mut.add_argument_group()


group_mut.add_argument('-a', type=int)
group_k.add_argument('-k', '--key', required=True, type=type=argparse.FileType('r'))

group_mut.add_argument('-s', type=int,)

group_mut.add_argument('-e',type=int)


parser_MyProg.add_argument( '-f', nargs='+', type=type=argparse.FileType('r'))

# некоторые действительные варианты использования (должны быть действительными)

args = parser.parse_args(
    'MyProg -a 8 -k k.txt  -f file1.txt file2.txt '.split())

args = parser.parse_args(
    'MyProg -s 8 -k k.txt  -f file1.txt file2.txt '.split())

args = parser.parse_args(
    'MyProg -s 8 -e 5  -f file1.txt file2.txt '.split())

# некоторые недопустимые варианты использования (не должно быть действительным)

args = parser.parse_args('MyProg -a 8    -f file1.txt file2.txt '.split())   #need a -k

args = parser.parse_args('MyProg -s 8  -f file1.txt file2.txt '.split())    #need a -k or -e

args = parser.parse_args('MyProg -s 8 -e 5 -k k.txt  -f file1.txt file2.txt '.split())  # -k and -e can't be present together

в приведенном выше коде я использовал -e в группе взаимного исключения, но это до сих пор работает, потому что: 1 - я не могу использовать его с -s 2 - я могу использовать его с -k 3 - аргумент -k требуется даже с аргументом -s -s я хочу либо -e , либо -k , но не оба )

Я немного упростил код, чтобы вы могли увидеть проблему. Программа представляет собой программу шифрования, дешифрования и хеширования, но я просто хотел прояснить, поэтому я немного ее упростил.

1 Ответ

1 голос
/ 21 апреля 2020

Использование из вашего кода (после некоторых исправлений синтаксических ошибок)

usage: stack61332378.py MyProg [-h] [-a A] -k KEY [-s S] [-e E] [-f F [F ...]]

Обратите внимание, что требуется '-k' (нет []).

Если я удаляю 'group_k' и '-k'

usage: stack61332378.py MyProg [-h] [-a A | -s S | -e E] [-f F [F ...]]

'a / s / e' образуют взаимоисключающую группу.

С другой стороны, это, кажется, самое чистое определение:

subparsers = parser.add_subparsers(dest='cmd', required=True)

parser_MyProg = subparsers.add_parser('MyProg')

group_mut = parser_MyProg.add_mutually_exclusive_group(required=True)
group_mut.add_argument('-a', type=int)
group_mut.add_argument('-s', type=int)

parser_MyProg.add_argument('-k', '--key', type=argparse.FileType('r'))
parser_MyProg.add_argument('-e',type=int)

parser_MyProg.add_argument( '-f', nargs='+', type=argparse.FileType('r'))

с помощью полученной справки:

usage: stack61332378.py MyProg [-h] (-a A | -s S) [-k KEY] [-e E]
                               [-f F [F ...]]

optional arguments:
  -h, --help         show this help message and exit
  -a A
  -s S
  -k KEY, --key KEY
  -e E
  -f F [F ...]

Вам придется применять любые правила, касающиеся k и e, встречающиеся с другими аргументами - после анализа. argparse имеет только xor взаимоисключающей группы и механизм subparser.

...