gpt4 book ai didi

python - 为什么子进程默认使用列表而不是带空格的字符串?

转载 作者:太空宇宙 更新时间:2023-11-03 16:01:34 24 4
gpt4 key购买 nike

为什么 Python 的 subprocess 模块默认期望参数为列表?为什么带空格的字符串(类似于正常运行命令时在终端中输入的内容)不是默认输入?有很多资料解释了如何将命令的空格分隔字符串传递到 subprocess 中,但不太清楚为什么默认值不是相反的。

最佳答案

TL;DR 使用列表会绕过 shell,这样您就不必担心 shell 以您不希望的方式解释动态构造的命令行。

<小时/>

假设您有一个非常简单的命令:echo foo。如下,同时使用字符串和列表:

Popen("echo foo", shell=True)
Popen(["echo", "foo"])

还没有太大区别。现在假设参数包含引号来保护空格和/或 shell 模式,echo "foo * bar":

Popen("echo \"foo   *    bar\"", shell=True)
Popen(["echo", "foo * bar"])

是的,我可以使用单引号来避免需要转义双引号,但您可以看到列表形式开始具有优势。现在假设我没有该命令的文字参数,但它存储在变量中。 现在您想使用哪个...

这个?

Popen('echo "%s"' % (x,), shell=True)

还是这个?

Popen(["echo", x])

如果您回答“第一个”,则 x 的值如下:

x = "\";rm -rf \""

您刚刚执行的命令是echo ""; rm -rf/"".您需要确保先转义 x 值中的所有特殊字符,然后再将其合并到您正在构建并传递给 shell 的字符串中。

或者您只需使用列表并完全避免使用 shell。

关于python - 为什么子进程默认使用列表而不是带空格的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40295995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com