subprocess模块的主要用来取代 一些旧的模块方法:os.systerm,os.popen...
三种主要的方法:
subprocess.run(*popenargs,input= None,timeout=None...)
subprocess.call(*popenargs,timeout=None,**kwargs)
subprocess.popen()#上面两种方法的底层封装
subprocess.call():执行命令,并返回执行状态,其中shell参数为False时,命令需要通过列表的方式传入。当shell的参数为True时,可直接传入命令。
a = subprocess.call(['df','-hT'],shell=False) a = subprocess.call('df -hT',shell=True)
subprocess.popen():
在此复杂的场景中,我们需要将一个进程的执行输出作为另一个进程的输入,在另一个场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令。
subprocess.popen()方法有以下参数:
args:shell命令,可以是字符串,或者序列类型,如list,tuple。
bufsize:缓冲区大小,可不用关心
stdin,stdout,stderr:分别表示程序的标准输入,标准输出及标准错误
shell:与上面方法中用法相同
cwd:用于设置子进程的当前目录
env:用于指定子进程的环境变量。如果env=None,则默认从父进程继承环境变量
在/root下创建一个suprocesstest的目录:
a = subprocess.Popen('mkdir subprocesstest',shell=True,cwd='/root')
**将一个子进程的输出,作为另一个子进程的输入;
import subprocess child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE) child2 = subprocess.Popen(["grep","0:0"],stdin=child1.stdout, stdout=subprocess.PIPE) out = child2.communicate()
a= subprocess.run('sleep 10',shell = True,stdout = subprocess.PIPE) a= subprocess.Popen('sleep 10',shell = True,stdout = subprocess.PIPE)
|----->的区别是:popen发出的命令后立即执行程序,不等子进程的结果。它是另开一个窗口来执行,而当前的程序继续执行
a.poll()方法:是显示执行结果。
a.pid()方法:是显示进程号。
wait()方法:等待子进程的结果
(在linux中kill(杀死进程)是给cpu发信号,让停止某个进程)---》在python中起到相同作用的是a.terminate()和a.kill(),后着是强制性。
communicate()与启动的进程交互,发送数据到stdin,并从stdout接受输出,然后等待任务结束
a = subprocess.Popen('python3 guess_age.py',sehll = True,stderr = subprocess.PIPE,stdin=subprocess.PIPE, stdout=subprocess.PIPE)
a.communecate(b'22') #根据communicate的工作机制,它只能执行一次
a.send_signal(*):给进程发信号。
当信号为*为singnal.SIGKILL时,进程会停止