Python系列 49 内置模块:subprocess

2023-05-16

subprocess简介

subprocess模块最早在Python2.4中引入,它会生成一个子进程,该子进程可以执行shell命令,并且会监听系统的标准输入管道、标准输出管道、标准错误管道,在命令执行完毕后,将结果进行返回到对应的管道中。

官方文档

如下图所示:

image-20210527190008666

它的功能虽然看上去十分单一,但是应用是非常广泛的。

试想,你是一名运维人员,编写了1个脚本,每天定时定点的在100台机器上获得它们的状态信息,就可以用到该模块。

让脚本在宿主机上通过该模块执行命令,并且拿到命令的返回结果,再通过网络返回结果并对其进行分析,依此判定各个宿主机的工作状态。

简单的使用

对于简单的使用,记住这4个方法即可,如下表所示:

方法描述
subprocess.Popen(…)执行系统命令,并将执行结果放入对应的管道中,返回一个Popen对象
PopenObject.stdout.read()从标准输出管道中获取执行结果
PopenObject.stderr.read()从标准错误管道中获取执行结果
PopenObject.stdin.write()通过标准输入管道与系统进行交互

subprocess.Popen()的可指定参数比较多,下面是它的签名:

    def __init__(self, args, bufsize=-1, executable=None,
                 stdin=None, stdout=None, stderr=None,
                 preexec_fn=None, close_fds=_PLATFORM_DEFAULT_CLOSE_FDS,
                 shell=False, cwd=None, env=None, universal_newlines=False,
                 startupinfo=None, creationflags=0,
                 restore_signals=True, start_new_session=False,
                 pass_fds=(), *, encoding=None, errors=None):

常用参数的释义如下:

  • args:将要执行的命令,可以是str类型或者list、tuple类型
  • bufsize:指定缓冲大小,0是没有,1是默认
  • executable:要执行的替换程序
  • stdin/stdout/stderr:标准输入、输出、错误管道的句柄
  • preexec_fn:仅在Unix平台下有效。指定一个可调用对象,通常是指函数,它将在fork出的子程序运行之前调用
  • close_sds:在Windows平台下,如果该参数指定为True,则fork出的子程序将不会继承父程序的标准输入、输出、错误管道中传输的内容,一般设置默认即可
  • shell:如果为True,则通过shell执行命令
  • cwd:设置子进程执行时的工作目录
  • env:用于指定子进程的环境变量,如果为None,子进程将继承父进程的环境变了
  • Universal_newlines:如果为True,则不区分平台,统一将换行符定义为\n

简单的执行命令并获取返回结果:

import subprocess

popenObject = subprocess.Popen(
    args="ping www.baidu.com",
    shell=True,
    stdin=subprocess.PIPE,
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE,
)

successMessage, errorMessage = popenObject.stdout.read(), popenObject.stderr.read()
print(successMessage.decode("gbk"))
print(errorMessage.decode("gbk"))

popenObject.stdout.close()
popenObject.stderr.close()

注意事项:

  • 如果你的测试环境是Windows,则对执行结果的解码方式需要使用GBK,因为Windows的终端字符编码方式就是GBK。而如果是Unix平台只需要使用UTF8即可。

通过stdin与与宿主机进行交互:

import subprocess

# 执行的语句
stdInCommand = """print (\"Hello, world\")"""

# 通过subprocess在测试机上启动1个新的Python REPT交互式环境
popenObject = subprocess.Popen(
    args="python",
    shell=True,
    stdin=subprocess.PIPE,
    stderr=subprocess.PIPE,
    stdout=subprocess.PIPE,
    )

# 写入内容,进行交互,注意每次交互完毕后都要立即关闭管道
popenObject.stdin.write(stdInCommand.encode("utf8"))
popenObject.stdin.close()

# 获取并打印结果
successMessage, errorMessage = popenObject.stdout.read(), popenObject.stderr.read()
print(successMessage.decode("gbk"))
print(errorMessage.decode("gbk"))

popenObject.stdout.close()
popenObject.stderr.close()

更多的操作

以下方法了解即可,其实用的并不多:

方法描述
subprocess.run()执行命令,不返回结果,拥有timeout参数,可设定超时时间
subprocess.call()执行命令,并且返回执行状态(bool类型,0成功,1失败)
subprocess.check_call()执行命令,并且返回执行结果和执行状态,如果命令执行失败则抛出异常,
subprocess.getstatusoutput()执行命令,返回1个tuple,[0]是执行状态,[1]是执行结果
subprocess.getoutput()执行命令,返回执行结果(str类型)
subprocess.check_output()执行命令,返回执行结果(bytes类型)

这里就不再进行演示了,感兴趣的可以参见官方文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python系列 49 内置模块:subprocess 的相关文章

  • 一文读懂串口(波形分析、起始位、数据位、停止位、空闲位)

    串口 一 串口 xff08 串行接口 xff09 二 异步串口 xff08 以下统称串口 xff09 三 重要参数1 波特率2 报文格式2 1 起始位2 2 数据位2 3 奇偶校验位2 4 停止位2 5 空闲位 四 波形1 具体连接2 波形
  • #学习笔记 keil环境下单片机模块化编程的方法

    1 选择 add new item to group 建立一个 c文件 xff0c 一个 h文件 xff0c 并且名字一致 2 h文件的写法 xff08 1 xff09 h文件中要有首位两段语言 例如 ifndef HEARTRATE H
  • 【Drone】航模遥控系统各协议简介

    最近学习了无人机的一些知识 xff0c 在关于遥控系统这部分的各种协议看的有些头大 xff0c 人都晕了 看了一些资料后终于大概理解了这套系统中那些一团乱麻般的各协议的意义 xff0c 大致总结一下 图一 遥控系统组成 这里参考FPV帮装机
  • C语言获取当前的工作路径

    在C语言中获取当前的工作路径的方法一般是用内置函数为 xff1a DWORD GetModuleFileName HMODULE hModule LPTSTR lpFilename DWORD nSize 函数的参数说明 xff1a hMo
  • C/C++的指针传递和引用传递

    相信你遇到过指针传参 值传参 引用传参 xff0c 这三个关系足够让你头脑爆炸 xff0c 搞不清楚三者的区别 但是恭喜你 xff0c 你看到了这篇文章 xff0c 小编保证你看后茅塞顿开 xff0c 一下子就顺畅了 首先 xff0c 我们
  • #define、typedef 和 using之间的联系和区别

    目录 一 define 1 含义 2 用处 1 条件编译 2 解宏 3 文件包含 二 typedef 1 含义 2 用处 1 数据类型别名 2 指针别名 3 结构体别名 4 与平台无关的数据类型 三 using 1 含义 2 用处 1 权限
  • C++四种cast的详细介绍

    目录 一 static cast 1 基本数据类型转换 2 指针和void指针的转换 3 父类和子类之间的转换 二 dynamic cast 三 const cast 1 加上const 2 去掉const xff08 1 xff09 co
  • C++内存模型简述

    目录 一 什么是内存模型 二 内存的分类 三 各分区例程 1 全局 静态存储区 2 常量区 3 栈 xff08 Stack xff09 区域 4 堆 xff08 Heap xff09 区域 四 堆和栈的区别 五 堆和自由存储区的区别 1 m
  • Eclipse的介绍和插件使用

    目录 一 Eclipse的介绍 二 快捷方式 三 常用快捷键 四 插件开发 五 插件安装 第一种 xff1a 直接复制法 第二种 xff1a 使用link文件法 第三种 xff1a 使用eclipse自带图形界面安装 第四种 xff1a 使
  • 动态时间规整算法——DTW

    没有做过机器学习的小伙伴们对这个算法应该不是特别的了解 xff0c 因为机器学习经常会用到这个算法 再将这个算法之前 xff0c 我们先看一下初中的知识点 欧几里得距离 在讲解动态时间规整算法 xff08 Dynamic Time Warp
  • C++ 中的基本输入/输出

    C 43 43 附带的库为我们提供了许多执行输入和输出的方法 在 C 43 43 中 xff0c 输入和输出以字节序列或更通常称为流的形式执行 输入流 xff1a 如果字节流的方向是从设备 xff08 例如 xff0c 键盘 xff09 到
  • 单例设计模式

    单例设计模式是一种经典的面向对象设计模式 xff0c 它允许在一个应用程序中只创建一个实例对象 xff0c 以便在整个应用程序中共享该对象的状态和行为 单例模式通常用于管理应用程序级别的资源 xff0c 例如数据库连接 线程池 配置对象等
  • 代理设计模式

    一 概述 代理设计模式是一种结构型设计模式 xff0c 它允许在一个对象和其它对象之间添加一个代理对象 xff0c 以控制对原始对象的访问 代理对象通常在访问原始对象之前或之后执行一些额外的操作 xff0c 例如记录日志 控制访问权限 缓存
  • C++线程入门:轻松并发编程

    在现代计算机应用程序中 xff0c 我们经常需要处理并发任务 xff0c 这就需要使用多线程来实现 C 43 43 是一种功能强大的编程语言 xff0c 提供了丰富的线程支持 xff0c 使得并发编程变得相对容易 C 43 43 线程是一种
  • 中断与DMA

    中断 Cortex M3256 个优先级和 128 个抢占级悬起pending 中断中断的类型中断结构 DMA通道映射源传输和目标传输寄存器中断状态寄存器和中断标志清除寄存器通道x配置DMA stream x configuration r
  • keil编译时候出现function “ ” declared implicitly的解决方法

    在警告信息function declared implicitly双引号中的 表示的是所调用函数 xff0c 在调用该函数的前加 extern 声明即可
  • 2022年高教社杯全国大学生数学建模国赛B题思路详解

    1 比赛报名与思路解析 xff08 持续更新750967193 xff09 2 比赛时间 xff1a 2022年9月15日18点到2022年9月18日20点 如下为B题思路 xff1a 先贴题目 xff1a 如下是初步分析 xff1a 无人
  • 旋转矩阵、欧拉角之间转换

    学习过程中涉及欧拉角和旋转矩阵的转换 xff0c 索性整理学习一下欧拉角四元数和旋转矩阵的概念以及matlab中的互相转换 本文摘自各大课本 xff0c 博客 xff0c 自己学习整理使用 xff0c 侵删 MATLAB矩阵乘法从左到右依次
  • ROS中C++ boost编程,类内回调函数

    首先熟悉boost bind 定义如下函数 xff1a span class token keyword int span span class token function f span span class token punctuat
  • 理解头文件(.h)、库文件(.lib)、和动态链接库文件(.dll),Fortran中的预处理及Fortran中function的简单使用

    文章目录 问题来源我的问题头文件 库文件和动态链接库头文件 h库文件 lib动态链接库 dll三者的关系静态链接动态链接 初识 Fortran 预处理包含文件 include Fortran中function简单使用声明interface调

随机推荐

  • OpenCV计算机视觉库,Tensorflow深度学习框架

    OpenCV是计算机视觉库 xff0c 包含了大量的图像处理和计算机视觉的算法 xff0c 但是在机器学习方面明显不足 xff0c ML模块只有SVM xff0c MLP xff0c kNN等有限的几种算法 dnn模块也是调用别的框架 Te
  • 动态库和静态库

    概念 什么是库 库是写好的 xff0c 现有的 xff0c 成熟的 xff0c 可以复用的代码 现实中每个程序都要依赖很多基础的底层库 xff0c 不可能每个人的代码都从零开始 xff0c 因此库的存在意义非同寻常 本质上来说 xff0c
  • Linux 内核设计与实现 —— 1.内核简介

    文章目录 操作系统和内核简介内核包括 xff1a 内核与应用程序 xff1a 内核与硬件设备 xff1a 内核的运行模式 xff1a Linux内核与Unix内核比较单内核与微内核设计之比较Linux内核与Unix内核差异 操作系统和内核简
  • VIM基础操作

    方向键 xff1a hjkl输入 向后输入 xff1a a shift最前向前输入 xff1a i shift最后向下新生成一行输入 xff1a o shift上一行删掉当前字符并写入 xff1a s 撤销 xff1a u键盘重映设 vim
  • Git基础操作

    Git基础操作 仓库配置初始化仓库查看当前所在仓库修改远端仓库 代码提交基础操作tag操作删除最后N次提交储藏 代码管理分支操作patch操作查看指定文件的修改历史统计代码量 仓库配置 初始化仓库 1 xff0c 安装 sudo apt g
  • Google SRE 自我评分——《Google SRE: How Google runs production systems》

    Google SRE How Google runs production systems 0 xff1a you are unfamiliar with the subject area 0 xff1a 不熟悉的领域 也就是说对相关的领域
  • java基础之byte转换工具类

    1 Byte 转 byte public static byte toPrimitives Byte oBytes byte bytes 61 new byte oBytes length for int i 61 0 i lt oByte
  • VLAN技术

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是VLAN技术 介绍VLAN之前先来了解一下广播风暴 xff1a 在交换式以太网出现后 xff0c 同一个交换机下不同的端口处于不同的冲
  • shell基础操作

    shell基础操作 有待补充基础操作基础素养 使用需要转译的字符休眠账户密码权限管道清屏让命令在后台运行黑洞 硬件查看显示分辨率 软件删除软件和配置文件 文件操作复制 目录返回上一次目录 查找findgrep 文件夹大小对比文件类型删除文件
  • makefile基础

    makefile基础 编译和链接makefile基础格式clean的写法makefile构成使用其他的makefile引用其他的makefile引用方式makefile 查找方式 make 的工作方式添加define警告编译不过 编译和链接
  • DHCP协议

    DHCP协议 动态主机设置协议 xff0c 使用UDP协议工作用途 自动分配IP管理 服务器端使用67 udp xff0c 客户端使用68 udp基本过程 请求IP租约 xff08 discover xff09 客户端广播 xff0c 服务
  • Linux驱动程序概述

    怎么写驱动 看原理图写驱动写测试程序 流程 分配file operations结构体设置结构体成员 open 61 led open 配置为输出引脚 wirte 61 led write 设置引脚状态 注册 xff08 告诉内核 xff09
  • Linux boot API

    Linux boot API 代码主控头文件U BOOT CMD 终端命令sf nand xff08 nor nand flash xff09 具体用法使用范例 setenv 命令 代码 主控头文件 boot主逻辑在此 xff0c 以Ing
  • dash与bash

    dash与bash 背景dash与bash的区别shell配置错误的可能特征坑 xff01 xff01 xff01 查看shell真实配置切换 背景 平台Linux编译 xff0c 可能会遇到脚本设置类型不同 xff08 如 xff1a 芯
  • Linux 基础概念

    文章目录 POSIX动态库和静态库ioctl MCU架构RISC与CISCx86 ARM MIPS架构 U bootBootloader 两种模式主机和板子的传输方式启动顺序bootloader两个阶段U Boot 移植 分区Linux s
  • rosdep update遇到ERROR: error loading sources list: The read operation timed out问题

    链接 xff1a https blog csdn net DDonggggg article details 115798335
  • C++ HTTP实现

    文章目录 一 HTTP基础知识1 什么是Http协议 xff1a 2 常见HTTP头3 HTTP请求头概述 xff08 HttpServletRequest xff09 4 URL格式详解 xff1a 二 WinHttp入门及实战1 介绍2
  • ros+ Optitrack控制bebop2无人机

    准备工作 xff1a Motive的安装及使用 xff1a https blog csdn net weixin 41536025 article details 89913961 ros订阅 OptiTrack 的消息通过vrpn cli
  • stm32中typedef的用法

    C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称 xff0c 来替代系统默认的基本类型名称 数组类型名称 指针类型名称与用户自定义的结构型名称 共用型名称 枚举型名称等 一旦用户在程序中定义了自己的数据类型名称 xff
  • Python系列 49 内置模块:subprocess

    subprocess简介 subprocess模块最早在Python2 4中引入 xff0c 它会生成一个子进程 xff0c 该子进程可以执行shell命令 xff0c 并且会监听系统的标准输入管道 标准输出管道 标准错误管道 xff0c