argparse: требовать необязательные аргументы, чтобы предшествовать позиционным аргументам
У меня есть сценарий Python, который оборачивает двоичный файл клиента openssh, и мне нужно проанализировать аргументы таким же образом. Я использую argparse.
С ssh это означает соединение с хостом, вход в систему как "a" и запуск "ls".
ssh -la host ls
Пока это означает подключиться к хосту и запустить "ls -la":
ssh host ls -la
argparse рассматривает их как одно и то же. Есть ли идиоматический способ сказать argparse, что необязательные аргументы должны предшествовать позиционным аргументам?
2 ответа
Решение
Использование nargs=argparse.REMAINDER
:
import argparse
p = argparse.ArgumentParser()
p.add_argument('-l', '--login')
p.add_argument('host')
p.add_argument('cmd', nargs=argparse.REMAINDER)
print p.parse_args('-la server ls'.split())
print p.parse_args('server ls -la'.split())
Результат:
Namespace(cmd=['ls'], host='server', login='a')
Namespace(cmd=['ls', '-la'], host='server', login=None)
Я думаю, что то, что вы пытаетесь достичь, вполне вписывается в argparse
концепция подкоманд. Посмотрите на это: https://docs.python.org/3/library/argparse.html