Не анализировать параметры после последнего позиционного аргумента

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

Я полагаю, что в optparse это можно сделать с помощью disable_interspersed_args.

В настоящее время у меня есть что-то вроде этого:

parser = argparse.ArgumentParser()
parser.add_argument('--parallel', default=False, action='store_true')
# maybe allow no command? this would ssh interactively into each machine...
parser.add_argument('command', nargs='+')
args = parser.parse_args()

Но если параметры передаются как часть команды (например, my_wrapper ls -l), вместо этого они интерпретируются ArgumentParser как неизвестные параметры. error: unrecognized arguments: -l

Если я использую parse_known_args(), параметры могут быть выбраны не по порядку.

p = argparse.ArgumentParser()
p.add_argument('-a', action='store_true')
p.add_argument('command', nargs='+')
print(p.parse_known_args())

$ python3 bah.py -b ls -l -a
(Namespace(a=True, command=['ls']), ['-b', '-l'])

Здесь вы можете видеть, что позиция -b перед ls была потеряна, а -a была проанализирована из команды, что нежелательно.

Как я могу:

  • Предотвратить анализ аргументов после определенного момента?
  • Отключить синтаксический анализ перемежающихся аргументов?
  • Разрешить использование аргументов с префиксом в качестве позиционных аргументов?

person Matt Joiner    schedule 27.06.2011    source источник


Ответы (3)


У меня такая же проблема. Я нашел решение в системе отслеживания ошибок argparse: http://code.google.com/p/argparse/issues/detail?id=52

Решение простое: замените nargs='+' (или '*') на nargs=argparse.REMAINDER. Это специальное значение не задокументировано, но оно делает то, что вы хотите.

person John Zwinck    schedule 12.07.2011
comment
Кажется, теперь это задокументировано. - person Russell Gallop; 04.11.2013

Я думаю, что для начала решения этих проблем лучше всего попробовать -- после всех необязательных аргументов. -- — это псевдоаргумент, который сообщает ArgumentParser, что все, что следует за ним, является позиционным аргументом. Документы находятся здесь

Что касается предотвращения анализа аргументов после определенного момента, вы можете передать часть argv в parse_args. Это в сочетании с некоторым самоанализом может быть использовано для ограничения того, что анализируется.

person dcolish    schedule 27.06.2011

Другой вариант — использовать parse_known_args, который останавливает синтаксический анализ, когда встречается неизвестный аргумент.

person Petr Viktorin    schedule 05.08.2014