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

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

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

Как я могу:

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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