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

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

Как я могу:

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

  • Существует ли эквивалент Python для модификатора Perl «/ x» для регулярных выражений?
  • Компиляция необходимых внешних модулей с помощью cython
  • django createduperuser не работает
  • Python-FTP загружает все файлы в каталог
  • Python 3 Float Decimal Points / Precision
  • python xlrd неподдерживаемый формат или поврежденный файл.
  • В Python-Pandas, как я могу подмножить фрейм данных с помощью определенных значений индекса datetime?
  • Scrapy CrawlSpider не сканирует первую целевую страницу
  • 3 Solutions collect form web for “Не анализируйте параметры после последнего позиционного аргумента”

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

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

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

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

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

    Python - лучший язык программирования в мире.