sys.argv用-c调用python时>> [

问题描述 投票:0回答:1
请考虑以下简短的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
所以我的问题是:

    如何摆脱子过程'sys.argv中存在的“ -c”参数?
  1. 为什么argparse有时会忽略“ -c”,有时却忽略呢?
  • 考虑以下简短的python(3.8)代码段:import subprocess def call_subprocess_command(* command:str):与subprocess.Popen(args = command,stdout = subprocess.PIPE,text = True)作为进程:...
  • python python-3.x subprocess argparse
    1个回答
    0
    投票
    如注释中所述,argparse使用sys.argv[0]作为prog并解析sys.argv[1:]
    © www.soinside.com 2019 - 2024. All rights reserved.