Подтвердить что ты не робот

Gem/git -строчные аргументы командной строки в Python

Есть ли модуль Python для выполнения gem/ git -строчных аргументов командной строки? Я имею в виду стиль gem/git:

$ ./MyApp.py
The most commonly used MyApp commands are:
  add        Add file contents to the index
  bisect     Find by binary search the change that introduced a bug
  branch     List, create, or delete branches
  checkout   Checkout a branch or paths to the working tree
  ...

$ ./MyApp.py branch
  * current-branch
    master

Без аргументов выход показывает, как вы можете продолжить. И есть специальная команда "help":

$ ./MyApp.py help branch

Что дает вам более глубокие советы о команде "branch".

Edit: И делать, я имею в виду, что печать печати для вас, выходы с недопустимым вводом, выполняет ваши функции в соответствии с вашей спецификацией CLI. Сортировка "URL-карты" для командной строки.

4b9b3361

Ответ 1

Да, argparse с add_subparser().

Все это хорошо описано в разделе Sub-commands.

Копирование одного из примеров оттуда:

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers()
>>> checkout = subparsers.add_parser('checkout', aliases=['co'])
>>> checkout.add_argument('foo')
>>> parser.parse_args(['checkout', 'bar'])
Namespace(foo='bar')

Изменить: К сожалению, нет специальной версии help, созданной самостоятельно, но вы можете получить подробное справочное сообщение (которое вам кажется) с -h или --help, как обычно после команды:

$ ./MyApp.py branch --help

Под подробным я не имею в виду, что это похоже на справочную страницу, это похоже на любую другую помощь --help: перечисление всех аргументов и т.д.

Пример:

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(description='Sub description')
>>> checkout = subparsers.add_parser('checkout', description='Checkout description')
>>> checkout.add_argument('foo', help='This is the foo help')
>>> parser.parse_args(['checkout', '--help'])
usage:  checkout [-h] foo

Checkout description

positional arguments:
  foo         This is the foo help

optional arguments:
  -h, --help  show this help message and exit

Если вам нужно, должно быть легко реализовать команду help, которая перенаправляет на --help.

Ответ 2

Разумный взлом, чтобы получить стиль "help" стиля gem/ git (я просто написал это для того, над чем я работаю):

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='sub_commands')
parser_branch = subparsers.add_parser('branch', description='list of branches')
parser_help = subparsers.add_parser('help')
parser_help.add_argument('command', nargs="?", default=None)

# I can't find a legitimate way to set a default subparser in the docs
#   If you know of one, please let me know!
if len(sys.argv) < 2:
    sys.argv.append('--help')

parsed = parser.parse_args()

if parsed.sub_commands == "help":
    if not parsed.command:
        parser.parse_args(['--help'])
    else:
        parser.parse_args([parsed.command, '--help'])

argparse определенно является шагом от optparse и других решений python, с которыми я столкнулся. Но IMO стиль обработки аргументов gem/ git - это более логичный и безопасный способ делать что-то, поэтому он раздражает, что он не поддерживается.