python:subprocess模块(一)

一、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
发布了46 篇原创文章 · 获赞 37 · 访问量 4512

猜你喜欢

转载自blog.csdn.net/weixin_42444693/article/details/104583996