当前位置: 首页 > news >正文

python之subprocess 模块(了解)

subprocess 模块(了解)

一、引入

subprocess模块是2.4版本中新增的模块, 它允许您生成新进程,连接到它们的 输入/输出/错误 管道,并获得它们的返回码(状态信息), 该模块的目的在于取代几个较旧的模块和功能

  • os.system
  • os.spawn*
  • os.popen*
  • popen2.*
  • commands.*

二、subprocess模块的简单使用

subprocess 模块可以用于执行系统命令, 拿到执行的结果, 速度比较的快, 并且它允许你创建一个新的进程让其去执行另外的程序, 并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等

1、简单执行命令拿到结果

  • 先来一个正确执行命令
import subprocess

res = subprocess.Popen(
    "dir",                   # 在终端运行的命令
    shell=True,              # 新开一个终端
    stdout=subprocess.PIPE,  # 执行完命令, 将正确输出放到一个管道里
    stderr=subprocess.PIPE,  # 将错误输出放到一个管道里
)
result = res.stdout.read()   # 拿到的是 bytes 格式的字符
result= str(result,encoding="gbk")  # 在windows需要使用gbk编码,linux和mac上是"utf-8"

print(result)
  • 执行正确结果如下

     驱动器 F 中的卷是 本地磁盘
     卷的序列号是 F2D8-4703
    
     F:\python_16\day 36 的目录
    
    2021/01/18  12:01    <DIR>          .
    2021/01/18  12:01    <DIR>          ..
    2021/01/18  11:55               718 client.py
    2021/01/18  12:01               498 project.py
    2021/01/18  11:20             1,147 sever.py
    2021/01/18  10:16               154 struct模块应用.py
    2021/01/18  10:16               573 客户端.py
    2021/01/18  10:16             1,005 服务端.py
                   6 个文件          4,095 字节
                   2 个目录 344,722,980,864 可用字节
    
  • 那如果你输入的命令不存在, stdout 改成 stderr

    import subprocess
    
    res = subprocess.Popen(
        "aaa",                   # 在终端运行的命令
        shell=True,              # 新开一个终端
        stdout=subprocess.PIPE,  # 执行完命令, 将正确输出放到一个管道里
        stderr=subprocess.PIPE,  # 将错误输出放到一个管道里
    )
    result = res.stderr.read()   # 拿到的是 bytes 格式的字符
    result= str(result,encoding="gbk")  # 在windows需要使用gbk编码
    
    print(result)
    
  • 执行错误结果如下:

    'aaa' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    

2、将第一次执行命令拿到的结果进行第二次操作

import subprocess

res1 = subprocess.Popen(     # 开启的第一的进程
    "dir",               
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
)

res2 = subprocess.Popen(     # 开启的第二个进程
    "findstr html*",        
    shell=True,
    stdin=res1.stdout,       # 将第一个进程的正确输出结果拿到做处理
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
)

result = res2.stdout.read()
result= str(result,encoding="gbk")
print(result)
  • 运行结果(成功)

    2021/01/18  14:16                 0 pycharm.html
    

3、直接一条终端命令实现上面的操作

  • 通过 | 管道符号可以实现将第一个命令的结果传递给第二个命令使用
import subprocess

res1 = subprocess.Popen( 
    "dir | findstr html*",  # 使用管道符号运行命令
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
)

result = res1.stdout.read()
result= str(result,encoding="gbk")
print(result)
  • 运行结果一样

    2021/01/18  14:16                 0 pycharm.html
    

参考资料

  • 官方文档:https://docs.python.org/3.8/library/subprocess.html?highlight=subprocess#frequently-used-arguments

相关文章:

  • configparser 模块 (了解)
  • Python之configparser 模块 (了解)
  • python之struct 模块详解
  • 网络架构及其演变过程
  • 计算机操作系统概述
  • 计算机网络OSI七层协议
  • 计算机网络之VLAN简述
  • 计算机网络之子网划分
  • 计算机网络之DHCP工作过程的六个主要步骤
  • 计算机网络之洪水攻击
  • TCP协议的三次握手和四次挥手详解
  • 春招进大厂面试Linux,就这6个问题!
  • 你准备好了吗?开始Python之旅吧!
  • Python期末总结
  • struct 模块
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • CSS 三角实现
  • gops —— Go 程序诊断分析工具
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • sublime配置文件
  • SwizzleMethod 黑魔法
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 基于遗传算法的优化问题求解
  • 码农张的Bug人生 - 见面之礼
  • 算法系列——算法入门之递归分而治之思想的实现
  • 阿里云ACE认证之理解CDN技术
  • ​ArcGIS Pro 如何批量删除字段
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (Git) gitignore基础使用
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (转)mysql使用Navicat 导出和导入数据库
  • ../depcomp: line 571: exec: g++: not found
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET微信公众号开发-2.0创建自定义菜单
  • .net下简单快捷的数值高低位切换
  • /etc/shadow字段详解
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [C#]C#学习笔记-CIL和动态程序集
  • [flume$2]记录一个写自定义Flume拦截器遇到的错误
  • [javaSE] GUI(Action事件)
  • [JS真好玩] 掘金创作者必备: 监控每天是谁取关了你?
  • [Latex] Riemann 问题中的激波,接触间断,膨胀波的 Tikz 绘图
  • [LeetCode] 197. 上升的温度
  • [LeetCode] 2.两数相加
  • [Linux](15)线程基础,线程控制,线程的互斥与同步
  • [MySQL光速入门]003 留点作业...
  • [Python]`threading.local`创建线程本地数据