一、subprocess简介:
subprocess模块允许你启动一个新的进程来运行子程序,连接输入/输出/错误等状态管道, 获得子进程的返回结果。subprocess被封装使用的高级函数方法有很多种,但是都是基于subprocess.Popen类实现的,所有本文重点介绍subprocess.Popen类的一些用法
二、subprocess.Popen类
1、Popen类的简介
subprocess模块底层的进程创建和管理是由Popen类来处理的,subprocess.Popen类主要用于在一个新进程中执行一个子程序。
2、Popen类的构造函数
详细解释移步:https://docs.python.org/zh-cn/3.9/library/subprocess.html
def __init__(self, args, bufsize=-1, executable=None,
stdin=None, stdout=None, stderr=None,
preexec_fn=None, close_fds=True,
shell=False, cwd=None, env=None, universal_newlines=None,
startupinfo=None, creationflags=0,
restore_signals=True, start_new_session=False,
pass_fds=(), *, encoding=None, errors=None, text=None):
参数说明:
args: 要执行的shell命令,可以是字符串,也可以是命令各个参数组成的序列。当该参数的值是一个字符串时,该命令的解释过程是与平台相关的,因此通常建议将args参数作为一个序列传递。
bufsize: 指定缓存策略,0表示不缓冲,1表示行缓冲,其他大于1的数字表示缓冲区大小,负数 表示使用系统默认缓冲策略。
stdin, stdout, stderr: 分别表示程序标准输入、输出、错误句柄。
preexec_fn: 用于指定一个将在子进程运行之前被调用的可执行对象,只在Unix平台下有效。
close_fds: 如果该参数的值为True,则除了0,1和2之外的所有文件描述符都将会在子进程执行之前被关闭。
shell: 该参数用于标识是否使用shell作为要执行的程序,如果shell值为True,则建议将args参数作为一个字符串传递而不要作为一个序列传递。
cwd: 如果该参数值不是None,则该函数将会在执行这个子进程之前改变当前工作目录。
env: 用于指定子进程的环境变量,如果env=None,那么子进程的环境变量将从父进程中继承。如果env!=None,它的值必须是一个映射对象。
universal_newlines: 如果该参数值为True,则该文件对象的stdin,stdout和stderr将会作为文本流被打开,否则他们将会被作为二进制流被打开。
startupinfo和creationflags: 这两个参数只在Windows下有效,它们将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如主窗口的外观,进程优先级等。
3、subprocess.Popen使用实例
示例一 stdout 正确输出:
import subprocess
# 演示一 Tasklist 执行命令 ,作用是:列出所有任务列表
sub = subprocess.Popen('Tasklist', shell=True,
stdout = subprocess.PIPE) # 输出正确内容到新管道
print('演示一,stdout用法')
print(sub.stdout.read().decode('gbk')) # 正确输出
示例二、stderr错误输出
# 演示二 ,执行错误命令,演示stderr输出
sub2 = subprocess.Popen('sssss',shell=True, # ssss是一个错误的命令行
stderr=subprocess.PIPE, # 输出错误内容到新管道
stdout=subprocess.PIPE # 正确输出
)
print('演示二,stderr的用法')
print(sub2.stderr.read().decode('gbk')) # 将不正确的内容通过stderr输出
结果:
'''
'sssss' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
'''
示例三:sudin程序标准输入
# 演示三, 演示stdin输入
# tasklist|findstr chrome 的意思是找出运行中的chrome程序
# 其运行逻辑是先通过tasklist找到所有任务列表,将找到的任务列表通过传递给 findstr chrome . | 是通道传递的作用
sub1 = subprocess.Popen('tasklist|findstr chrome', shell=True,
stdout = subprocess.PIPE )
# 基于tasklist|findstr chrome的运行逻辑,可以分为两部分。
sub2 = subprocess.Popen('tasklist',shell=True,
stdout=subprocess.PIPE ) # 找到所有任务列表
sub3 = subprocess.Popen('findstr chrome', shell=True,
stdin=sub2.stdout, # 将sub2的找到的所有任务列表当成sub3_1的输入内容
stdout=subprocess.PIPE)
print('演示三,stdin的用法')
print(sub3.stdout.read().decode('gbk'))
结果:
演示三,stdin的用法
chrome.exe 6360 Console 1 202,664 K
chrome.exe 2924 Console 1 6,412 K
chrome.exe 2144 Console 1 8,128 K
chrome.exe 3816 Console 1 382,300 K
chrome.exe 8612 Console 1 39,156 K
chrome.exe 9484 Console 1 14,552 K
chrome.exe 10336 Console 1 86,288 K
chrome.exe 3740 Console 1 85,820 K
chrome.exe 12224 Console 1 77,900 K