当用 -c 调用蟒蛇时

请考虑以下短的 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

所以我的问题是:

  1. 如何摆脱子进程中存在的“-c”参数?sys.argv

  2. 为什么阿格帕西有时可以忽略“-c”,有时不能?


米琪卡哇伊
浏览 73回答 1
1回答

蝴蝶不菲

如注释中所述,用作 和 解析 。argparsesys.argv[0]progsys.argv[1:]如果我指定参数,然后替换默认的“-c”,这可能会更清晰:prog1119:~/mypy$ python3 -c 'import argparse; p=argparse.ArgumentParser(prog="PROG");print(p.parse_args())' --test foobarusage: PROG [-h]PROG: error: unrecognized arguments: --test foobar在正常脚本用法中, 是脚本的名称。这里的“脚本名称”是“-c”。sys.argv[0]使用与 以下各项相呼应的脚本:sys.argv1119:~/mypy$ python3 echo.py --test foobar['echo.py', '--test', 'foobar']
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python