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