Python 学习之四:subprocess模块

subprocess的目的就是启动一个新的进程并且与之通信。

1. call

父进程等待子进程执行命令,返回子进程执行命令的状态码,如果出现错误,不进行报错

import subprocess
subprocess.call(['dir'],shell=True)

2. check_call

父进程等待子进程执行命令,返回执行命令的状态码,如果出现错误,进行报错【如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try…except…来检查】

import subprocess
subprocess.check_call(['dir'],shell=True)

3. check_output

父进程等待子进程执行命令,返回子进程向标准输出发送输出运行结果,检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性和output属性,output属性为标准输出的输出结果,可用try…except…来检查。

import subprocess
res3 = subprocess.check_output(['dir'],shell=True)

4. Popen

  实际上,subprocess模块中只定义了一个类: Popen。上面的几个函数都是基于Popen()的封装(wrapper)。从Python2.4开始使用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)

与上面的封装不同,Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block)。

#!/usr/bin/env python
import subprocess

child = subprocess.Popen(['ping','-c','4','www.baidu.com'])  #创建一个子进程,进程名为child,执行操作ping -c 4 www.baidu.com
child.wait()                             #子进程等待
print 'hello'

另外你可以用以下方法操作子进程:

child.poll() # 检查子进程状态
child.kill() # 终止子进程
child.send_signal() # 向子进程发送信号
child.terminate() # 终止子进程
ps: 子进程的PID存储在child.pid

子进程文本流控制

子进程的标准输入、标准输出和标准错误如下属性分别表示:

child.stdin | child.stdout | child.stderr

我们还可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe),如下2个例子:

import subprocess

child1 = subprocess.Popen(['cat','/etc/passwd'],stdout=subprocess.PIPE)
child2 = subprocess.Popen(['grep','root'],stdin=child1.stdout,stdout=subprocess.PIPE)

print child2.communicate()
另外该命令可以通过更改CWD,来决定执行shell的当前目录。

child1 = subprocess.Popen(['cat','/etc/passwd'],stdout=subprocess.PIPE,cwd="/home/ute")

你可能感兴趣的:(Python 学习之四:subprocess模块)