subprocess 是Python 2.4 中新增的一个模块,它允许你生成新的进程,连接到它们的input/output/error 管道,并获取它们的返回(状态)码。
subprocess模块中常用的函数
函数 | 描述 |
---|---|
subprocess.run() |
Python 3.5 中新增的函数。执行指定的命令,等待命令执行完成后返回一个包含执行结果的CompletedProcess类的实例 |
subprocess.call() |
执行指定命令,返回命令执行状态,起功能类似于os.system(cmd) |
subprocess.check_call() |
Python 2.5 中新增的函数。执行指定的命令,如果执行成功返回状态码,否则抛出异常。其功能等价于subprocess.run(..., check=True) |
subprocess.check_output() |
Python 2.7 中新增的函数。执行指定的命令,如果执行状态码为0,则返回命令执行结果,否则抛出异常 |
subprocess.getoutput() |
接收字符串格式命令,执行命令并返回执行结果,其功能类似于os.popen(cmd).read()和commands.getoutput(cmd) |
subprocess.getstatusoutput(cmd) |
执行cmd命令,返回一个元组(命令执行状态,命令执行结果输出),其功能类似于commands.getstatusoutput() |
说明:
- 在Python3.5之后的版本中,官方文档中提倡通过subprocess.run()函数替代其他函数来使用subprocess模块的功能。
- 在Python 3.5之前的版本中,我们可以通过subprocess.call(),subprocess.getoutput()等其他函数来使用subprocess模块的功能。
- subprocess.run(),subprocess.call(),subprocess.check_call()和subprocess.check_output()都是通过对subprocess.Popen的封装来实现的高级函数,因此如果我们需要更复杂功能时,可以通过subprocess.Popen来完成。
- subprocess.getoutput()和subprocess.getstatusoutput()函数是来自Python 2.x的commands模块的两个遗留函数。它们隐式的调用系统shell,并且不保证其他函数所具有的安全性和异常处理的一致性。另外它们从Python 3.3.4 开始才支持Windows 平台
函数参数说明
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_new_lines=False)
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
subprocess.check_output(args, *, stdin=None, stderr=Nont, shell=False, universal_new_lines=False, timeout=None)
subprocess.getstatusoutput(cmd)
subprocess.getoutput(cmd)
参数说明:
-
args
: 要执行的shell命令,默认应该是一个字符串序列,如['df', '-Th'] 或者 (‘df’, '-Th'),也可以是一个字符串,如'df -Th',但是此时需要把shell参数的值设置为True。 -
shell
: 如果shell为True,那么指定的命令将通过shell执行。如果我们需要访问某些shell的特性,如管道,文件名通配符,环境变量扩展功能,这将是非常有用的。当然,python本身也提供了许多类似shell的特性的实现,如glob, fnmatch, os.walk(), os.path.expandvars(), os.expanduser()和shutil等。 -
check
: 如果check参数的值是True, 且执行命令的进程以非0状态码退出,则会抛出一个CalledProcessError的异常,且该对象会包含 参数,退出状态码,以及stdout和dtderr(如果它们被捕获的话) -
stdout
: 命令执行结果,正常输出 -
stderr
: 错误输出 -
run()
: 函数默认不会捕获命令执行结果的正常输出和错误输出,如果我们向获取这些内容要传递subprocess.PIPE,然后可以通过返回的CompletedProcess类实例的stdout,stderr属性或捕获相应的内容。 -
call() 和 check_call()
: 函数返回的命令执行的状态码,而不是CompletedProcess类实例,所以对于它们而言,stdout和stderr不适合赋值为subprocess.PIPE。 -
check_output()
: 函数默认就会返回执行结果,所以不用设置stdout的值,如果我们希望在结果中捕获错误信息,可以执行stderr=subprocess.STDOUT。 -
input
: 该参数是传递Popen.communicate(),通常该参数的值必须是一个字节序列,如果universal_newlines=True,则其值应该是一个字符串。 -
universal_newlines
: 该参数影响的是输入和输出的数据格式。比如他的值默认为False,此时stdout和stderr的输出是字节序列;当该参数设置为True时,stdout和stderr的输出就是字符串。
网友评论