请考虑以下短的 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 容器内运行的命令。但是,调用的代码的 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
所以我的问题是:
如何摆脱子进程中存在的“-c”参数?sys.argv
为什么阿格帕西有时可以忽略“-c”,有时不能?
蝴蝶不菲
相关分类