Как заставить argparse принимать другие параметры в качестве аргументов? - PullRequest
0 голосов
/ 13 июня 2018

Я пишу скрипт-обертку, который передает некоторые аргументы другому приложению.Вызов wrapper.py --param1 x --param2 y --args -i 1 -name "Mike Wazowski" --verbose должен в конце концов инициировать subprocess.Popen, который в итоге выполняет:

app.exe -i 1 -n "Mike Wazowski" --verbose

Однако это не работает, так как argparse в моем скрипте wrapper.py считает -i, -n и--verbose - это параметры, которые он должен анализировать.

Я мог бы инкапсулировать аргументы, которые я просто хотел бы передать в кавычки, но тогда мне также пришлось бы избегать любых кавычек в кавычках.Тем не менее, я хочу действительно избежать этого:

`wrapper.py --param1 x --param2 y --args "-i 1 -name \"Mike Wazowski\" --verbose"`

То, что я уже пробовал

Я беру этот пример из документации:

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.add_argument('baz', nargs='*')
>>> parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])

Но вместо того, чтобы дать --bar 1 2, я должен быть в состоянии предоставить, например, --bar -i -n "Mike Wazowski" --verbose.Это, однако, приведет к ошибке:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.parse_args('--foo -s 1 -e 2'.split())
usage: [-h] [--foo [FOO [FOO ...]]]
: error: unrecognized arguments: -i -n "Mike Wazowski" --verbose

Что я могу сделать, чтобы сделать эту работу?
Я в порядке, всегда определяя мой параметр --args как последний параметр.Должен ли я просто рассматривать --args как фиктивный параметр, а затем вручную анализировать sys.argv, чтобы получить то, что мне нужно?Если да, то как argparse может игнорировать все, что происходит после вхождения --args в моей команде оболочки?

1 Ответ

0 голосов
/ 15 июня 2018

Спасибо за комментарий, hpaulj!Я думаю, что nargs=argparse.REMAINDER - мой лучший вариант, так как он отделяет аргументы целевого приложения от аргументов моей оболочки.Таким образом, мне не нужно беспокоиться о том, что аргументы обертки конфликтуют с аргументами, которые я просто хочу передать.

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--verbose', action='store_true')
parser.add_argument('rest_args', nargs=argparse.REMAINDER)

args = parser.parse_args()
print(args)

Так что при вызове wrapper.py -- -i 1 -name "Mike Wazowski" --verbose я получаю:

Namespace(rest_args=['-i', '1', '-name', 'Mike Wazowski', '--verbose'], verbose=False)

А если позвонить wrapper.py --verbose -- -i 1 -name "Mike Wazowski" --verbose, я получу:

Namespace(rest_args=['-i', '1', '-name', 'Mike Wazowski', '--verbose'], verbose=True)

Обратите внимание, что -- на самом деле необязателен в приведенных выше примерах и даст те же результаты.

...