subprocess
模块介绍
subprocess模块允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等。
subprocess
模块打算来替代几个过时的模块和函数,比如: os.system, os.spawn*, os.popen*, popen2.*
命令。
让我们来看一下subprocess
有哪些不同的函数.
https://blog.csdn.net/qq_34765864/article/details/91517246
主要函数
call()
父进程等待子进程完成 (阻塞)
语法:
subprocess.call(
commands:list|str,
shell:bool
) -> returncode # 相当于Linux exit code
返回退出信息(returncode,相当于Linux exit code)
check_call()
- 父进程等待子进程完成 (阻塞)
- 语法:同call()
- 返回:0
检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try…except…来检查
check_output()
- 父进程等待子进程完成 (阻塞)
- 语法:同call()
- 返回:返回子进程向标准输出的输出结果
检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性和output属性,output属性为标准输出的输出结果,可用try…except…来检查。
Popen()
语法:
class 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()
的封装(wrapper)。这些封装的目的在于让我们容易使用子进程。当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程。
与上面的封装不同,Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block),举例:
import subprocess
child = subprocess.Popen(['ping','-c','4','blog.linuxeye.com'])
print 'parent process'
Popen() 实例下有几个声明周期api,分别是:
声明周期
child = subprocess.Popen('ping -c4 blog.linuxeye.com', shell=True)
child.wait() # 阻塞运行,父进程在开启子进程之后并等待child的完成
child.poll() # 检查子进程状态
child.kill() # 终止子进程
child.send_signal() # 向子进程发送信号
child.terminate() # 终止子进程
child.pid # 存储子进程 PID
文本流控制
child.stdin() #
child.stdout() #
child.stderr() #
child1.communicate() #
在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe)
import subprocess
child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
print child1.stdout.read(),
#或者child1.communicate()
import subprocess
child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["grep","0:0"],stdin=child1.stdout, stdout=subprocess.PIPE)
out = child2.communicate()
基础使用
import subprocess
subprocess.call
subprocess.call(["node", '-v'], shell=True)