Только одна опция командной строки с argparse - PullRequest
4 голосов
/ 18 июня 2011

Я пытаюсь создать CLI с модулем argparse, но я хотел бы иметь разные команды с разными требованиями к аргументам, я попробовал это:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('foo', help='foo help')
parser.add_argument('test', nargs=1, help='test help')
args = parser.parse_args()

то, что я хотел бы, это бытьв состоянии запустить python test.py foo и python test.py test somearg, но когда я запускаю python test.py foo, я получаю error: too few arguments.Есть ли способ, чтобы команды могли вести себя как git status, git commit или pip install?или есть лучший способ создать CLI в Python?

Ответы [ 3 ]

15 голосов
/ 18 июня 2011

@ crodjer правильно;
привести пример:

import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(title='subcommands', 
                                   description='valid subcommands',
                                   help='additional help')
foo_parser = subparsers.add_parser('foo', help='foo help')
bar_parser = subparsers.add_parser('bar', help='bar help')
bar_parser.add_argument('somearg')
args = parser.parse_args()

Проверка различных аргументов для каждого подпарсера:

$ python subparsers_example.py bar somearg
Namespace(somearg='somearg')

$ python subparsers_example.py foo
Namespace()

$ python subparsers_example.py foo somearg
usage: argparse_subparsers.py foo [-h]
subparser_example.py foo: error: unrecognized arguments: somearg

Вывод справки:

$ python subparsers_example.py foo -h
usage: argparse_subparsers.py foo [-h]

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

$ python subparsers_example.py bar -h
usage: argparse_subparsers.py bar [-h] somearg

positional arguments:
  somearg

optional arguments:
  -h, --help  show this help message and exit
6 голосов
/ 18 июня 2011

Это то, что вы, вероятно, хотите:

http://docs.python.org/library/argparse.html#sub-commands

С этим вы можете добавить субаргументы, которые имеют свои собственные схемы аргументов.

0 голосов
/ 18 июня 2011

По умолчанию аргументы argparse используют одно значение. Если вы хотите, чтобы у foo было другое поведение, вам нужно это указать. Похоже, вы думаете, что по умолчанию это nargs = 0, но это не так. Из документации argparse (на http://docs.python.org/dev/library/argparse.html#nargs): "Если аргумент ключевого слова nargs не указан, количество потребляемых аргументов определяется действием. Обычно это означает, что будет использован один аргумент командной строки и один элемент ( не список) будет произведен. "

Вы можете использовать nargs = '?' для foo и задайте ему значение по умолчанию, если в командной строке ничего не указано, или используйте действие не по умолчанию (например, store_true?).

...