subprocess模块:用于启动新的进程的模块,它可以用于执行外部命令,获取进程的输出向进程发送输入和等待进程结束。
多进程协同,python里大致有三种方式:
1、os.system函数 阻塞式
2、multiprocessing 模块 使用场景,密集型的计算
3、subprocess模块
subprocess模块主要函数:
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, universal_newlines=False):执行指定的命令,等待命令执行完成后返回一个对象。
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)
:执行指定的命令,放回命令执行的状态。
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) :与call的主要区别是会输出报错。
subprocess.getoutput(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False):执行命令,并将其输出形成字符串返回。
subprocess.Popen 它是底层
process = subprocess.Popen(
'cmd',
shell=True,
cmd='路径' # 执行命令的位置
stdout=subprocess.PIPE,
stdin = subprocess.PIPE,
stderr = subprocess.PIPE)
shell: 打开终端,Linux中是终端,Windows中是cmd
stdout=subprocess.PIPE:如果该命令执行成功,那么将该命令的标准输出放入管道
#! /usr/bin/env pyhton
import subprocess
obj = subprocess.Popen(['python'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True) # 执行命令,打开python环境
#注意 shell=True的意思是,将通过操作系统的shell执行命令。确保你环境里可以执行你操作的命令
#universal_newlines=True的意思是,stdout和stderr的输出是字符串。方便写入文件或者输出
obj.stdin.write('print(1)\n') # 输入命令
obj.stdin.write('print(2)')
obj.stdin.close()
cmd_out = obj.stdout.read() # 获取输出
obj.stdout.close()
cmd_err = obj.stderr.read() # 获取错误
obj.stderr.close()
print(cmd_out)
print(cmd_err)
~
函数主要参数介绍:
args :要执行的命令,必须是个字符串,字符串参数列表。
stdin、stdout、stderr:子进程的标准输入 输出 错误 最常用的是subprocess.PIPE。
timeout : 设置命令超时。
shell : 值为bool,如果参数为ture 将通过操作系统的shell执行命令。