Рассмотрим следующий короткий фрагмент python (3.8):
import subprocess
def call_subprocess_command(*command: str):
with subprocess.Popen(args=command, stdout=subprocess.PIPE, text=True) as process:
for line in iter(process.stdout.readline, ""):
print(line)
call_subprocess_command("python", "-c", "import sys; print(sys.argv)", "--test", "foo")
Это напечатает ['-c', '--test', 'foo']
. Я хочу, чтобы он печатал только ['--test', 'foo']
.
Мне это нужно, потому что я динамически вычисляю команду для запуска внутри контейнера docker. Однако синтаксический анализатор вызываемого кода всегда прерывается, потому что он получает аргумент «- c», с которым он не знает, как обращаться:
call_subprocess_command("python", "-c",
"import argparse; parser=argparse.ArgumentParser(); parser.add_argument('test'); print(parser.parse_args())",
"--test", "foo")
Это приводит к тому, что использование выводится в stderr, и он анализирует "- c" как значение для "test":
usage: -c [-h] test
-c: error: unrecognized arguments: --test
Мой текущий обходной путь использует аргументы только для ключевых слов ("--test"), но Я действительно хотел бы избавиться от этого "- c", если это возможно.
call_subprocess_command("python", "-c",
"import argparse; parser=argparse.ArgumentParser(); parser.add_argument('--test'); print(parser.parse_args())",
"--test", "foo")
Это приводит к тому, что я хочу:
Namespace(test='foo')
Я не совсем понимаю, почему это работает, потому что теперь, кажется, игнорирует "- c". Если я добавлю еще один параметр, о котором он не знает, например, «--bar», он снова вылетает, хотя «- c» также является параметром, о котором он не знает:
call_subprocess_command("python", "-c",
"import argparse; parser=argparse.ArgumentParser(); parser.add_argument('--test'); print(parser.parse_args())",
"--test", "foo", "--bar")
usage: -c [-h] [--test TEST]
-c: error: unrecognized arguments: --bar
Итак, мои вопросы:
- Как мне избавиться от аргумента "- c", присутствующего в подпроцессе '
sys.argv
? - Почему может argparse иногда игнорировать "- c", а иногда нет?