Python argparse: ведущая черта в аргументе - PullRequest
0 голосов
/ 04 октября 2018

Я использую модуль Python argparse для анализа аргументов командной строки.Рассмотрим следующий упрощенный пример:

# File test.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-s', action='store')
parser.add_argument('-a', action='append')
args = parser.parse_args()
print(args)

, который может быть успешно вызван как

python test.py -s foo -a bar -a baz

Требуется один аргумент после -s и после каждого -a, который может содержать пробелыесли мы используем цитату.Однако если аргумент начинается с дефиса (-) и не содержит пробелов, код вылетает:

python test.py -s -begins-with-dash -a bar -a baz

ошибка: аргумент -s: ожидается один аргумент

Я понял, что -begins-with-dash интерпретируется как начало новой опции, что недопустимо, поскольку -s еще не получил требуемый аргумент.Также довольно ясно, что ни один вариант с именем -begins-with-dash не был определен, и поэтому он не должен интерпретировать его как параметр в первую очередь.Как я могу заставить argparse принимать аргументы с одной или несколькими начальными чертами?

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Если вместо этого вы пытаетесь указать несколько значений для одного аргумента:

parser.add_argument('-a', action='append', nargs=argparse.REMAINDER)

захватит все после -a в командной строке и поместит его в a.

python test.py -toe -a bar fi -fo -fum -s fee -foo
usage: test.py [-h] [-s S] [-a ...]
test.py: error: unrecognized arguments: -toe

python test.py -a bar fi -fo -fum -s fee -foo
Namespace(a=[['bar', 'fi', '-fo', '-fum', '-s', 'fee', '-foo']], s=None)

Обратите внимание, что, хотя -s является распознанным аргументом, argparse.REMAINDER добавляет его в список аргументов, найденных -a, поскольку он находится после -a в командной строке

0 голосов
/ 04 октября 2018

Вы можете заставить argparse интерпретировать аргумент как значение, добавив знак равенства: python test.py -s=-begins-with-dash -a bar -a baz Namespace(a=['bar', 'baz'], s='-begins-with-dash')

...