請考慮以下短的 python (3.8) 代碼段:import subprocessdef 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”,有時不能?
1 回答

蝴蝶不菲
TA貢獻1810條經驗 獲得超4個贊
如注釋中所述,用作 和 解析 。argparsesys.argv[0]progsys.argv[1:]
如果我指定參數,然后替換默認的“-c”,這可能會更清晰:prog
1119:~/mypy$ python3 -c 'import argparse; p=argparse.ArgumentParser(prog="PROG");print(p.parse_args())' --test foobar
usage: PROG [-h]
PROG: error: unrecognized arguments: --test foobar
在正常腳本用法中, 是腳本的名稱。這里的“腳本名稱”是“-c”。sys.argv[0]
使用與 以下各項相呼應的腳本:sys.argv
1119:~/mypy$ python3 echo.py --test foobar
['echo.py', '--test', 'foobar']
添加回答
舉報
0/150
提交
取消