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容器内运行的命令。但是,被调用的代码的cli解析器始终会中断,因为它接收到“ -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
所以我的问题是:
sys.argv
中存在的“ -c”参数?argparse
使用sys.argv[0]
作为prog
并解析sys.argv[1:]
。