介绍
使用subprocess模块的目的是用于替换os.system等一些旧的模块和方法。
运行python的时候,我们都是在创建并运行一个进程。像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。
subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信。
导入模块
1
|
>>> import subprocess |
命令执行call()
执行由参数提供的命令,把数组作为参数运行命令。其功能类似于os.system(cmd)。
1
|
>>> subprocess.call([ 'ls' , '-l' ) |
其中参数shell默认为False。
在shell设置为True时,可以直接传字符串:
1
|
>>> subprocess.call( 'ls -l' ,shell = True ) |
获得返回结果check_output()
call()是不返回显示的结果的,可以使用check_ouput()来获得返回的结果:
1
2
|
>>> result = subprocess.check_output([ 'ls' , '-l' ],shell = True ) >>> result.decode( 'utf-8' ) |
进程创建和管理Popen类
subprocess.popen代替os.popen。可以创建一个Popen类来创建进程和进行复杂的交互。
创建不等待的子进程
1
2
3
4
|
import subprocess child = subprocess.Popen([ 'ping' , '-c' , '4' , 'www.baidu.com' ]) print ( 'Finished' ) |
添加子进程等待
1
2
3
4
5
|
import subprocess child = subprocess.Popen([ 'ping' , '-c' , '4' , 'www.baidu.com' ]) child.wait() # 等待子进程结束 print ( 'Finished' ) |
添加了wait()后,主进程会等待子进程结束再执行下面的语句。
子进程文本流控制
标准输出重定向:
1
2
3
4
|
import subprocess child = subprocess.Popen([ 'ls' , '-l' ],stdout = subprocess.PIPE) #将标准输出定向输出到subprocess.PIPE print (child.stdout.read()) |
使用stdin与其配合使用:
1
2
3
4
5
6
|
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() |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://segmentfault.com/a/1190000016814135