python子进程中shell = True或False之间的区别

时间:2016-07-16 07:32:01

标签: python python-2.7 subprocess

我刚开始使用python子进程模块。

代码subprocess.call("ls", shell = False) and subprocess.call("ls", shell = True)都返回相同的结果。我只是想知道两个shell选项之间的主要区别。

1 个答案:

答案 0 :(得分:2)

Straight out of the Docs:

  

如果shell为True,则将通过shell执行指定的命令。如果您主要使用Python来提供它在大多数系统shell上提供的增强控制流,并且仍然希望方便地访问其他shell功能,例如shell管道,文件名通配符,环境变量扩展以及将〜扩展到用户家中,这将非常有用。目录。但是,请注意Python本身提供了许多类似shell的功能的实现(特别是glob,fnmatch,os.walk(),os.path.expandvars(),os.path.expanduser()和shutil)。

这可以打开shell注入技术的代码,可以在这里更好地解释:

Shell Injection Shell=True

例如,在Windows机器上,如果将shell设置为false,请参阅以下内容:

import subprocess

subprocess.Popen("dir", shell = False)

运行时,此代码将返回WindowsError: [Error 2],指出无法找到指定的文件。但是如果shell为True,则返回一个对象。这是因为'dir'正在使用“管道”。通过cmd,因此,内置命令如dir将起作用。

与subprocess.call相同。