简介subprocess模块允许您生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。即subprocess支持我们从当前进程生成子进程来执行命令,虽然都是生成子进程的程序,但是与fork不同的是,subprocess更多的是指定执行一个执行shell命令的子程序。Usesubprocess.run(args,*,stdin=None,stdout=None,stderr=None,shell=False,text=None,cwd=None,input=None,timeout=None)这个函数会生成一个用于执行args子进程和返回一个CompletedProcess对象。args可以是列表或字符串,例如:["ls","-l"]或"pwd"。注意当args为字符串时,只能简单指定一个不带任何参数的可执行文件,除非指定的shell参数为True。(如果传递单个字符串,则shell必须为True,否则字符串必须简单地命名要执行的程序而不指定任何参数。)stdin、stdout和stderr执行子进程的标准输入、输出和错误流。通常,只会使用stdout和stderr。如果未指定stdout,则标准输出将直接打印在屏幕上。一般使用管道subprocess.PIPE来指定stdout,对于stderr则为subprocess.STDOUT,这样标准输出和错误会暂时存放在管道中,可以通过CompletedProcess对象取出。shell参数与args一起使用。如果args是字符串,最好将shell设置为True。text参数:如果不使用文本模式,stdin、stdout和stderr将作为二进制流打开。不执行编码或行结束转换。cwd参数指定一个路径,让子进程在args代表的shell命令中执行,在cd到指定路径之前,输入传递给Popen.communicate,超时传递给Popen.communicate,对于子进程返回的CompletedProcess对象。run,它有一些属性可以方便我们获取子进程执行命令。returncode获取子流程的返回值,0表示执行成功。argsargs对应子进程的stdout如果调用subprocess.run函数时指定了PIPE,则stdout结果将从管道中获取,否则为None。stderr与stdout相同。但是,作为一个模块级的功能,它实际上是通过类级的一些类和方法来实现的,即subprocess.Popen和Popen.communicate.subprocess.Popen(args,stdin=None,stdout=None,stderr=None,shell=False,cwd=None,text=None)使用这个类时,会创建一个子进程来执行args,返回一个Popen实例对象。下面介绍该类的一些方法:poll方法检查子进程是否终止。如果终止则返回returncode,否则返回None。terminate该方法终止子进程kill该方法杀死子进程。与terminate的区别在于传递的SIGNAL的不同。两者没有区别。wait(timeout=None)父进程等待子进程结束,如果超时,会报错,抛出TimeExpired异常。communicate(input=None,timeout=None)这个方法是和子进程通信,也就是Passdatatoinput,timeout同上,返回一个tuple(stdout_data,stderr_data)。如果流以文本模式打开,则数据将是字符串;否则,bytes.Popen的一些属性:stdin,stdout,stderr和前面的CompletedProcess类似,returncode实例对应的子进程的返回值args实例对应的子进程的commandpidargs实例对应的子进程的pidinstanceCautionsPopen.wait在使用stdout=PIPE或stderr=PI时会死锁PE和子进程向管道生成足够的输出,从而阻止等待OS管道缓冲区接受更多数据。使用管道时使用Popen.communicate()来避免这种情况。即Popen使用PIPE方法时最好不要使用wait,否则可能造成死锁,使用communicate会避免这种情况。对于subprocess.run函数创建的子进程,父进程会自动等待子进程结束,如果单独使用subprocess.Popen,父进程不会等待,可以使用Popen.wait,但是它上面不建议使用这个函数,但实际上Popen.communicate除了Interactwithprocess的作用外,还有Waitforprocesstoterminate,所以上面提到使用commnunicate而不是wait+Popen.stdout,Popen.stderr。
