3.3Python之subprocess模块

版权声明:本文为博主原创文章,未经博主允许不得转载。 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”)。

猜你喜欢

转载自blog.csdn.net/webzhuce/article/details/79949990