аргументы командной строки в стиле gem / git в Python - PullRequest
22 голосов
/ 16 марта 2012

Есть ли модуль 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".

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

Ответы [ 3 ]

34 голосов
/ 16 марта 2012

Да, argparse с add_subparsers().

Все это хорошо объяснено в разделе Подкоманды .

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

>>> 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.

4 голосов
/ 02 июля 2012

Разумный взлом, чтобы получить стиль "помощь" в стиле 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 для обработки аргументов - это просто более логичный и безопасный способ выполнения задач, поэтому досадно, что он не поддерживается.

0 голосов
/ 12 марта 2018

Я хотел сделать что-то похожее на команды git, где бы я загружал второй сценарий на основе одного из параметров командной строки, чтобы этот сценарий заполнял дополнительные параметры командной строки, а также помогал работать.

Мне удалось это сделать, отключив параметр справки, проанализировав известные аргументы, добавив дополнительные аргументы, повторно включив параметр справки, а затем проанализировав остальные аргументы.

Это то, что я придумал.

import argparse 
#Note add_help=False
arg_parser = argparse.ArgumentParser(description='Add more arguments after parsing.',add_help=False)
arg_parser.add_argument('MODE',  default='default',type=str, help='What commands to use')


args = arg_parser.parse_known_args()[0]

if args.MODE == 'branch':
   arg_parser.add_argument('-d', '--delete', default='Delete a branch')
   arg_parser.add_argument('-m', '--move', default='move a branch')
elif args.MODE == 'clone' :
   arg_parser.add_argument('--local', '-l')
   arg_parser.add_argument('--shared')

#Finally re-enable the help option, and reparse the arguments
arg_parser.add_argument(
            '-h', '--help',
            action='help', default=argparse.SUPPRESS,
            help=argparse._('show this help message and exit'))

args = arg_parser.parse_args()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...