我刚开始使用python子进程模块。
代码subprocess.call("ls", shell = False) and subprocess.call("ls", shell = True)
都返回相同的结果。我只是想知道两个shell选项之间的主要区别。
答案 0 :(得分:2)
如果shell为True,则将通过shell执行指定的命令。如果您主要使用Python来提供它在大多数系统shell上提供的增强控制流,并且仍然希望方便地访问其他shell功能,例如shell管道,文件名通配符,环境变量扩展以及将〜扩展到用户家中,这将非常有用。目录。但是,请注意Python本身提供了许多类似shell的功能的实现(特别是glob,fnmatch,os.walk(),os.path.expandvars(),os.path.expanduser()和shutil)。
这可以打开shell注入技术的代码,可以在这里更好地解释:
例如,在Windows机器上,如果将shell设置为false,请参阅以下内容:
import subprocess
subprocess.Popen("dir", shell = False)
运行时,此代码将返回WindowsError: [Error 2]
,指出无法找到指定的文件。但是如果shell为True,则返回一个对象。这是因为'dir'
正在使用“管道”。通过cmd,因此,内置命令如dir将起作用。
与subprocess.call相同。