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

标签 python subprocess

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

相关文章:

python - 如何按发布日期显示最新 5 篇帖子?

javascript - Python 创建的简单 HTML/Javascript 页面显示为空白

python - 从子流程获取进度消息

python - 等待在 python 之外播放的歌曲完成

c - 使用两个管道的双向进程间通信

python - 定义函数,TypeError

Python:json.loads 在转义时阻塞

javascript - 如何正确呈现 FilteredSelectMultiple

python - 子进程无法正确打印 esxcli 命名空间

python - 如何格式化 subprocess.call() 语句?