subprocess最早是在2.4版本中引入的,用来生成子进程,并可以通过管道连接他们的输入和输出以及错误,并能得他们的返回值
在python中,我们通过标准库中的subprocess包来fork一个子进程,并且运行一个外部的程序。subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。
旧有模块的使用
- os.system()
执行操作系统的命令,将结果输出到屏幕,只返回命令执行状态(0:成功,非 0 : 失败)
- os.popen()
执行操作系统的命令,会将结果保存在内存当中,可以用read()
方法读取出来
subprocess模块
- subprocess.run()
# python 解析则传入命令的每个参数的列表
>>> subprocess.run(["df","-h"])
# 需要交给Linux shell自己解析,则:传入命令字符串,shell=True
>>> subprocess.run("df -h|grep /dev/sda1",shell=True)
- subprocess.call()
执行命令,返回命令的结果和执行状态,0或者非0
- subprocess.check_call()
执行命令,返回结果和状态,正常为0 ,执行错误则抛出异常
- subprocess.getstatusoutput()
接受字符串形式的命令,返回 一个元组形式的结果,第一个元素是命令执行状态,第二个为执行结果
- subprocess.getoutput()
接受字符串形式的命令,放回执行结果
- subprocess.check_output()
执行命令,返回执行的结果,而不是打印
subprocess.Popen()
其实以上subprocess使用的方法,都是对subprocess.Popen的封装
- stdout标准输出
res = subprocess.Popen("ls /tmp/yum.log", shell=True, stdout=subprocess.PIPE) # 使用管道
res.stdout.read() # 标准输出
b'/tmp/yum.log\n'
res.stdout.close() # 关闭
- stderr标准错误
>>> import subprocess
>>> res = subprocess.Popen("lm -l",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
# 标准输出为空
>>> res.stdout.read()
b''
#标准错误中有错误信息
>>> res.stderr.read()
b'/bin/sh: lm: command not found\n'
- poll()
定时检查命令有没有执行完毕,执行完毕后返回执行结果的状态,没有执行完毕返回None
>>> res = subprocess.Popen("sleep 10;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> print(res.poll())
None
>>> print(res.poll())
None
>>> print(res.poll())
0
- wait()
等待命令执行完成,并且返回结果状态
>>> obj = subprocess.Popen("sleep 10;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> obj.wait()
# 中间会一直等待
0
- terminate()
结束进程
import subprocess
>>> res = subprocess.Popen("sleep 20;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> res.terminate() # 结束进程
>>> res.stdout.read()
b''
- pid
获取当前执行子shell的程序的进程号
import subprocess
>>> res = subprocess.Popen("sleep 5;echo 'hello'",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> res.pid # 获取这个linux shell 的 进程号
2778