Я пишу оболочку для клиента командной строки 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
была проанализирована из команды, что нежелательно.
Как я могу:
- Предотвратить анализ аргументов после определенного момента?
- Отключить синтаксический анализ перемежающихся аргументов?
- Разрешить использование аргументов с префиксом в качестве позиционных аргументов?