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

Другие вопросы по тегам