subprocess模块
子进程管理
subprocess 模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码。
即允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等。
注意:使用这个模块之前要先引入该模块。
Popen类
subprocess模块中定义了一个Popen类,通过它可以来创建进程,并与其进行复杂的交互。
import subprocess
import time
# “Tasklist”命令是一个用来查看运行在本地或远程计算机上的所有进程的命令行工具,带有多个执行参数。
# Popen 等同于cmd.exe命令解释器
obj = subprocess.Popen("tasklist",
# shell=True等同于调用命令解释器
shell=True,
# 管道内存正确输出结果
stdout=subprocess.PIPE,
# 管道内存错误输出结果
stderr=subprocess.PIPE
)
print("=============>", obj) # 拿到的是subprocess的对象
# =============> <subprocess.Popen object at 0x00000193E7E04BB0>
# 主进程从管道拿到子进程结果
stdout_res = obj.stdout.read()
stderr_res = obj.stderr.read()
# subprocess使用当前系统默认编码,得到结果为bytes类型,在windows下需要用gbk解码
print(stdout_res.decode('gbk'))
print(stderr_res.decode('gbk'))
# 主进程想拿到子进程运行命令的结果做进一步的处理
# 每启动一个进程在内存里占用一个内存空间,进程与进程之间的内存空间是相互隔离的
# 在子进程运行Tasklist这条命令,运行完之后这条命令的结果一定是产生在子进程的内存空间里
# 不可能在主进程拿到这个结果,这个就要用到共享内存了,即“管道”