請(qǐng)考慮以下短的 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']我需要這個(gè),因?yàn)槲艺趧?dòng)態(tài)計(jì)算要在 docker 容器內(nèi)運(yùn)行的命令。但是,調(diào)用的代碼的 cli 解析器總是中斷,因?yàn)樗邮盏健?c”參數(shù),它不知道如何處理該參數(shù):call_subprocess_command("python", "-c", "import argparse; parser=argparse.ArgumentParser(); parser.add_argument('test'); print(parser.parse_args())", "--test", "foo")這導(dǎo)致用法被打印到 stderr,并且它將“-c”解析為“test”的值:usage: -c [-h] test-c: error: unrecognized arguments: --test我目前的解決方法是使用僅關(guān)鍵字參數(shù)(“--test”),但如果可能的話,我真的很想去掉那個(gè)“-c”。call_subprocess_command("python", "-c", "import argparse; parser=argparse.ArgumentParser(); parser.add_argument('--test'); print(parser.parse_args())", "--test", "foo")這導(dǎo)致我想要的:Namespace(test='foo')我不太明白為什么這有效,因?yàn)樗F(xiàn)在似乎忽略了“-c”。如果我添加另一個(gè)它不知道的參數(shù),例如“--bar”,它會(huì)再次崩潰,即使“-c”也是一個(gè)它不知道的參數(shù):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所以我的問題是:如何擺脫子進(jìn)程中存在的“-c”參數(shù)?sys.argv為什么阿格帕西有時(shí)可以忽略“-c”,有時(shí)不能?
1 回答

蝴蝶不菲
TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
如注釋中所述,用作 和 解析 。argparsesys.argv[0]progsys.argv[1:]
如果我指定參數(shù),然后替換默認(rèn)的“-c”,這可能會(huì)更清晰: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]
使用與 以下各項(xiàng)相呼應(yīng)的腳本:sys.argv
1119:~/mypy$ python3 echo.py --test foobar
['echo.py', '--test', 'foobar']
添加回答
舉報(bào)
0/150
提交
取消