赞
踩
python3.7中的subprcess模块允许用户启动新进程,并且连接进程的标准输入、标准输出、标准错误,并能获得其返回码,该模块将会替换os.system和os.spawd函数。
调用subprocess模块时推荐使用run()函数,底层Popen接口也可以直接被调用
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)
运行args描述的命令,等待命令完成,然后返回CompletedProcess实例。
上面显示的参数仅仅是最常见的参数,在下面的常用参数中进行了描述(因此在缩写签名中使用了仅关键字符号)。完整函数签名与Popen构造函数的签名大致相同 - 此函数的大多数参数都传递给该接口。 (timeout, input, check, and capture_output没有传递)
- capture_output:如果capture_output为true,则将捕获stdout和stderr。使用时,将使用stdout = PIPE和stderr = PIPE自动创建内部Popen对象。 stdout和stderr参数可能不会与capture_output同时提供。
- timeout:timeout参数传递给Popen.communicate()。如果超时到期,子进程将被终止并等待。子进程终止后,将重新引发TimeoutExpired异常。
- input:input参数传递给Popen.communicate(),从而传递给子进程的stdin。如果使用它必须是字节序列,或者如果指定了编码或错误或文本为真,则必须是字符串。使用时,使用stdin = PIPE自动创建内部Popen对象,也可以不使用stdin参数。
- check:如果check为true,并且进程以非零退出代码退出,则将引发CalledProcessError异常。该异常的属性包含参数,退出代码以及stdout和stderr(如果它们被捕获)。
- 如果指定了编码或错误,或者text为true,则使用指定的编码和错误或io.TextIOWrapper默认值在文本模式下打开stdin,stdout和stderr的文件对象。 universal_newlines参数等同于text,用于向后兼容。默认情况下,文件对象以二进制模式打开。
- env:如果env不是None,则它必须是定义新进程的环境变量的映射;这些用于代替继承当前进程环境的默认行为。它直接传递给Popen。
>>> subprocess.run(["ls", "-l"]) # doesn't capture outputCompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run("exit 1", shell=True, check=True)Traceback (most recent call last):
...subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
>>> subprocess.run(["ls", "-l", "/dev/null"], capture_output=True)CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n', stderr=b'')
class subprocess.CompletedProcess¶
subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
为了支持各种用例,Popen构造函数接受大量可选参数。 对于大多数典型用例,许多这些参数可以安全地保留其默认值。
所有调用都需要args,并且应该是一个字符串或一系列程序参数。通常优选提供一系列自变量,因为它允许模块处理任何所需的转义和引用参数(例如,允许文件名中的空格)。如果传递单个字符串,则shell必须为True(参见下文),否则字符串必须简单地命名要执行的程序而不指定任何参数。
stdin,stdout和stderr分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为PIPE,DEVNULL,现有文件描述符(正整数),现有文件对象和无。 PIPE表示应该创建一个新的子管道。 DEVNULL表示将使用特殊文件os.devnull。使用默认设置None,不会发生重定向;子项的文件句柄将从父项继承。另外,stderr可以是STDOUT,它表示来自子进程的stderr数据应该被捕获到与stdout相同的文件句柄中。
如果指定了编码或错误,或者文本(也称为universal_newlines)为true,则将使用调用中指定的编码和错误或io.TextIOWrapper的默认值在文本模式下打开文件对象stdin,stdout和stderr。
对于stdin,输入中的行结束字符'\ n'将转换为默认行分隔符os.linesep。对于stdout和stderr,输出中的所有行结尾都将转换为'\ n'。
如果未使用文本模式,则stdin,stdout和stderr将作为二进制流打开。不执行编码或行结束转换。
安全考虑
与其他一些popen函数不同,此实现永远不会隐式调用系统shell。 这意味着所有字符(包括shell元字符)都可以安全地传递给子进程。 如果通过shell = True显式调用shell,那么应用程序有责任确保适当地引用所有空格和元字符以避免shell注入漏洞。
当使用shell = True时,shlex.quote()函数可用于正确地转义将用于构造shell命令的字符串中的空格和shell元字符。
Popen对象
Popen对象类有以下方法:
proc = subprocess.Popen(...)try:
outs, errs = proc.communicate(timeout=15)except TimeoutExpired:
proc.kill()
outs, errs = proc.communicate()
4.Popen.send_signal(signal):发送信号给子进程
5.Popen.terminate():停止子进程
6.Popen.kill():杀死子进程
7.Popen属性:
老的高级API接口:
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)
运行参数组成的命令,等待命令完成,然后返回returncode属性
遗留的shell调用函数。
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False, cwd=None, timeout=None)
运行参数组成的命令,等待命令完成,如果返回码为0,抛异常。
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, cwd=None, encoding=None, errors=None, universal_newlines=None, timeout=None, text=None)
运行参数组成的命令,并返回它的输出。如果返回码非0,则抛异常。
该模块也提供下列从2.x遗留下来的命令模块。这些操作隐式调用了系统shell,上述有关安全性和异常处理一致性的保证均不适用于这些功能。
subprocess.getstatusoutput(cmd):返回值(exitcode,output
)
基本使用:
>>> subprocess.getstatusoutput('ls /bin/ls')(0, '/bin/ls')>>> subprocess.getstatusoutput('cat /bin/junk')(1, 'cat: /bin/junk: No such file or directory')>>> subprocess.getstatusoutput('/bin/junk')(127, 'sh: /bin/junk: not found')>>> subprocess.getstatusoutput('/bin/kill $$')(-15, '')
subprocess.getoutput(cmd):返回值shell中执行命令的标准输出和标准错误
基本使用:
>>> subprocess.getoutput('ls /bin/ls')'/bin/ls'
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。