常用模块之subprocess模块

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时,进程会停止

原文地址:https://www.cnblogs.com/z18271397173/p/8511273.html