Генерация argparsers с поведением типа apt-get install - PullRequest
0 голосов
/ 02 февраля 2019

Я прочитал всю документацию по argparsers в python и пытаюсь создать подпарсеры и парсеры взаимного исключения, но не могу добиться такого же поведения, как в типичной "sudo apt-get install".

Iхотите передать аргумент get alogn с суффиксом -info или -reverse и последующим подкомандой fodder и / или dtype и номером для fodder или dtype для запуска правильного действия, если используется get-info или get-reverse.

Например,

~: python calculator.py get-info fodder 1000 => return a calculation
~: python calculator.py get-reverse fodder 1000 => return a invert calculation
~: python calculator.py get => displays get info (showing get-info... get-reverse)

Я думаю, что есть способ сделать это с помощью методов argparse Objects, но я не могу найти способ сделать это.

if __name__ == '__main__':
    parse = argparse.ArgumentParser(prog='Defense Calculator')
    parse.add_argument('-f', '--fdu', type=int, default=1000, help='Fodder units')
    parse.add_argument('-p', '--profile', type=str, default="BigGunsMLG", help='Fodder units')
    parse.add_argument('-i', '--info', action="store_true", help='Print Defense Profiles lists')

    # create the top-level parser
    subparsers = parse.add_subparsers(help='getter-command help')

    # create the parser for the "foo" command
    parser_get = subparsers.add_parser('get', help='Require info of a Defense Profile')
    p_get_excluders = parser_get.add_mutually_exclusive_group(required=True)
    p_get_excluders.add_argument('-info', action='store_true', help='Returning info elements by fdu')
    p_get_excluders.add_argument('-reverse', action='store_true', help='Returning fdus by element')
    parser_get.add_argument('fodder', type=int, default=1000, help='Fodder units')
    parser_get.add_argument('dtype', '--dtype', type=str, default='RL', help='Type of element to get info')

1 Ответ

0 голосов
/ 02 февраля 2019

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

Сможете ли вы выполнить то, что вы хотите, с помощью аргумента под названием «get-info» и аргумента под названием «get-reverse»?Чего добивается разделение слова «получить»?Есть ли надежда, что вы можете вставить туда другие слова (например, set set?), Смешать и сопоставить их?

APT (https://wiki.debian.org/Apt) - менеджер пакетов Debian. Apt-get ()https://wiki.debian.org/apt-get) является интерфейсом командной строки для него. "-Get" является частью команды, а не аргументом, переданным ей. Его аргументы по-прежнему анализируются с пробелами между ними.

Оболочка (например,Bash https://www.gnu.org/software/bash/manual/html_node/Environment.html) - это то, что анализирует пробелы между параметрами при выполнении программы. Он берет каждое слово после первого (которое является именем исполняемого файла), разделенное пробелами, и помещает их вмассив строк, называемый окружением. Ваша программа получает этот массив строк и не обрабатывает пробелы между аргументами и даже не видит пробелы. Они уже разделены временем, в которое она его видит.

Я знаю, что яЯ не совсем ответил на ваш вопрос, и, возможно, есть более простой ответ, о котором я не знаю. У меня есть идея сделать некоторую предварительную обработку ваших аргументов перед тем, как выи найти их в argparse.Например, вы можете перебирать каждый аргумент и проверять строки, начинающиеся с «get-», и, если это так, делать что-то с этим на этом уровне.Я надеюсь, что вы нашли что-нибудь из этого полезного!

Редактировать / Подробнее: (после прочтения вашего комментария)

Когда ваша программа на Python запущена, аргументы уже былиотсортировано в массив строк.argparse запрограммирован для понимания этого массива строк.Это не в состоянии сломать эти строки, насколько мне известно.Если вы планируете использовать только три варианта: get, get-info и get-reverse, то для каждого из них свой аргумент может оказаться наиболее прагматичным вариантом.Если это слишком грубая сила для вас и / или вы планируете добавить больше опций, нам нужно подумать о путях изменения аргументов между точкой, в которой запускается программа, и точкой, которую argparse читает их.argparse не делает то, что вы хотите, поэтому мы должны взять то, что вы хотите, и изменить его на то, что фактически принимает argparse.

Вот вариант: вы можете сделать так, чтобы argparse работал так, как вы этого хотитедля calculator.py get, calculator.py get -info и calculator.py get -reverse с теми дополнительными пробелами, которые вам не нужны.Когда программа запускается, в первую очередь она ищет строки типа get-info или get-reverse и заменяет их на 2 разные строки, добавляя между ними пробел, который пользователь никогда не вводил.Тогда пусть argparse сделает свое дело.Несмотря на то, что пользователь ввел «get-info», argparse интерпретирует его так, как если бы он набрал «get -info», потому что вы сами обработали текст между запуском программы и вызовом argparse.

...