为什么 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/