subprocess模块详解
1.import subprocess
简单点说,就是通过python来调用模块来执行操作系统的命令。
我们经常需要通过Python去执行一条系统命令或脚本,系统的shell命令是独立于你的python进程之外的,每执行一条命令,就是发起一个新进程。
在python程序中每发起一个命令就会打开打开一个新的窗口,然后把结果返回到你的python程序中。这就是python程序能够调用shell命令的原因。
2.
可以直接输入命令,系统会打开新的窗口。进程从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,返回结果。
b = subprocess.run(["control"])
stderr = subprocess.PIPE stderr 是标准错误。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
stdout = subprocess.PIPE 标准输出
PIPE 管道
a = subprocess.run(["cleanmgr"],stderr = subprocess.PIPE,stdout = subprocess.PIPE)
a.renturncode 命令的返回状态。返回结果 不为0得话,会举出错误。
a.args 查看运行的参数,如上面返回的就是cleanmgr。
检查命令返回状态,不是0得话会报错。
a.check_returncode
3.每个程序在内存里的数据都是独立的,不能互相访问。
那么python的进程怎么得到输出数据的?
python先接受一个参数,然后执行这个参数带来的命令。PIPE是一个管道,连接python程序和系统文件,文件通过这个桥梁可以间接把文件传输出来。
下面这个程序的PIPE就是操作系统,操作系统打开文件,然后发送到python程序中,从而达到互相访问。
架起来一个桥梁,文件会被copy到操作系统里,不会立即执行。
a.stdout 直接得到传输出来的数据。
后面如果加check = True 如果stderr返回不是0,则直接报错。
a = subprocess.run(["cleanmgr"],stderr = subprocess.PIPE,stdout = subprocess.PIPE)
如果想获得文件里的部分文件,则需要在参数里加入管道 |,并且不需要列表,而且后买你要加入一个shell = True。
参数里有关到就不要用列表形式。
后面加shell 是告诉subprocess 不需要再拼参数了,直接把参数发到shell里面。
a = subprocess.run("control,|con,prec",stderr = subprocess.PIPE,stdout = subprocess.PIPE,shell = True)