为了账号安全,请及时绑定邮箱和手机立即绑定

当用 -c 调用蟒蛇时

当用 -c 调用蟒蛇时

米琪卡哇伊 2022-09-13 19:13:36
请考虑以下短的 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']


查看完整回答
反对 回复 2022-09-13
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信