subprocess – 创建附加进程,subprocess模块提供了一种一致的方法来创建和处理附加进程,与标准库中的其它模块相比,提供了一个更高级的接口。用于替换如下模块: os.system() , os.spawnv() , os和popen2模块中的popen()函数,以及 commands().
一、运行外部命令
subprocess.call(command) 方法
subprocess的call方法可以用于执行一个外部命令,但该方法不能返回执行的结果,只能返回执行的状态码: 成功(0) 或 错误(非0)
call()方法中的command可以是一个列表,也可以是一个字符串,作为字符串时需要用原生的shell来执行:
如上实例所示,虽然我们能看到执行的结果,但实际获取的值只是状态码
二、错误处理
subprocess.check_call() 方法
我们说过call执行返回一个状态码,我们可以通过check_call()函数来检测命令的执行结果,如果不成功将返回 subprocess.CalledProcessError 异常
三、捕获输出结果
subprocess.check_output() 方法
call()方法启动的进程,其标准输入输出会绑定到父进程的输入和输出。调用程序无法获取命令的输出结果。但可以通过check_output()方法来捕获输出。
以下例子将chek_output()方法执行命令异常时的错误捕获,而避免输出到控制台.
四、直接处理管道
subprocess.Popen()方法
函数call(), check_call() 和 check_output() 都是Popen类的包装器。直接使用Popen会对如何运行命令以及如何处理其输入输出有更多控制。如通过为stdin, stdout和stderr传递不同的参数。
与进程的单向通信
通过Popen()方法调用命令后执行的结果,可以设置stdout值为PIPE,再调用communicate()获取结果
返回结果为tuple. 在python3中结果为byte类型,要得到str类型需要decode转换一下输出结果
五、与进程的双向通信
Popen.communicate()方法用于和子进程交互:发送数据到stdin,并从stdout和stderr读数据,直到收到EOF。等待子进程结束。
捕获错误输出
Popen其它方法
1、Popen.pid 查看子进程ID
2、Popen.returncode 获取子进程状态码,0表示子进程结束,None未结束
在使用Popen调用系统命令式,建议使用communicate与stdin进行交互并获取输出(stdout),这样能保证子进程正常退出而避免出现僵尸进程。看下面例子
本文转自:http://blog.csdn.net/songfreeman/article/details/50735045