版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/webzhuce/article/details/79949990
基本概念
从Python2.4开始,Python引入subprocess模块来管理子进程,以取代旧模块的方法。不但可以调用外部的命令作为子进程,而且可以连接到子进程的input/output/error管道,获取相关的返回信息。
subprocess模块
Python的subprocess模块可以实现子进程。该模块只定义了一个类:Popen。可以使用Popen来创建进程,并与进程进行复杂的交互。它的构造函数如下:
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)
- 参数args:可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。如果是序列类型,第一个元素通常是可执行文件的路径。也可以显式地使用 execteable参数来指定可执行文件的路径。
- 参数stdin,stdout,stderr:分别表示程序的标准输入、输出、错误句柄。它们可以是PIPE,文件描述符或文件对象,也可以设置为None,表示从父进程继承。
- 参数shelll:设置为True,程序将通过shell来执行。
- 参数env:字典类型,用于指定子进程的环境变量。如果设置为None,表示子进程的环境变量从父进程中继承。
Popen的方法
- Popen.poll():用于检查子进程是否已经结束。设置并返回returncode属性。
- Popen.wait():等待子进程结束。设置并返回returncode属性。
- Popen.communicate(input = None):与子进程交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。commuicate()返回一个元组:(stdoutdata, stderrdata)。注意如果希望通过进程的stdin向其发送数据,在创建Popen对象的时候,参数stdin必须设置为PIPE。同理,如果希望从stdout和stderr获取数据,比较将stdout和stderr设置为PIPE。
- Popep.send_signal(signal):向子进程发送信号。
- Popen.terminate():停止(stop)子进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程。
- Popen.kill():杀死子进程。
subprocess中定义数个创建子进程的函数,这些函数分别以不同的方式创建子进程。
- subprocess.call():父进程等待子进程完成,返回退出信息(returncode属性)
- subprocess.check_call():父进程等待子进程完成,返回0。检查退出信息,如果returncode不为0,则举出错误subprocess.calledProcessError,该对象包含了returncode属性。
- subProcess.check_output():父进程等待子进程完成,返回子进程向标准输出的输出结果。检查退出信息,如果returncode不为0,则举出错误subprocess.calledProcessError,该对象包含了returncode属性。
示例演示
import time, subprocess
if __name__ == '__main__':
print "start main"
child = subprocess.Popen(["ping","-c","5","www.csdn.com"])
print("parent process")
while True:
print "parent processing"
time.sleep(2)
从运行结果看,父进程在开启子进程之后,并没有等待子进程完成,而是直接运行print(“parent process”)。
import time, subprocess
if __name__ == '__main__':
print "start main"
child = subprocess.Popen(["ping","-c","5","www.csdn.com"])
child.wait()
print("parent process")
while True:
print "parent processing"
time.sleep(2)
从运行结果看,父进程在开启子进程之后等待子进程完成,再运行print(“parent process”)。