引言

在写程序时,我们无法避免需要运行外部程序,相较于功能比较简单的os.system(),更加倾向于使用subprocess模块来执行外部程序

模块介绍

subprocess.run()

使用subprocess.run()执行命令的时候,父进程会一直等待直到子进程结束后才会继续运行父进程

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False)

"""
参数介绍 1. args: cmd命令
2. stdin: 传递参数进来
3. input: 传递参数进来,使用input的时候不能使用stdin
4. stdout: 外部程序的输出,可以指定通过管道(subprocess.PIPE)
5. stderr: 外部程序的报错输出, 可以指定通过管道(subprocess.PIPE)或者和stdout使用同一句柄(stderr=subprocess.STDOUT)
6. shell: 是否通过shell执行命令
7. timeout: 如果超时则终止子进程,该参数被传递给Popen.communicate()
8. check: 检查returncode是否为0,如果不为0则引发subprocess.CalledProcessError错误, 可以通过try....except...捕获 """

实例

import subprocess as sp

# 三种方式构造命令
sp.run('ls -l', shell=True) sp.run(['ls', '-l'], shell=True) sp.run(' '.join(['ls', '-l']), shell=True) # 判断是否正确执行命令
sp.run('ls -l', shell=True, check=True) # 获取命令的输出
p = sp.run('ls -l', shell=True, check=True, stdout=sp.PIPE, stderr=sp.PIPE) print(p.stdout.read()) # 使用stdin接受数据传入
p1 = sp.run('ls -l', shell=True, check=True, stdout=sp.PIPE, stderr=sp.PIPE) print(p1.stdout.read()) p2 = sp.run('grep lovefish', shell=True, check=True, stdin=p1.stdout, stdout=sp.PIPE, stderr=sp.PIPE) print(p2.stdout.read())

例子

subprocess.Popen()

subprocess.Popen(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=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=()) """
参数介绍 1. args:cmd命令,字符串或者列表
2. bufsize:0:无缓冲; 1:行缓冲,只可以在universal_newlines=True时被使用;其他正值则为缓冲区的大小;负数则为使用系统默认缓冲
3. executable:一般不使用,用来表示shell程序
4. stdin:传递数据进来
5. stdout:命令的输出,可以指定通过管道输出(subprocess.PIPE)
6. stderr:命令的报错输出,可以通过管道(subprocess.PIPE)或者和stdout使用同一句柄输出(subprocess.STDOUT)
7. preexec_fns: 在exec之前执行
8. close_fds:如果为真,在unix下,则关闭除0,1,2之外的文件。在windows下无法设置close_fds为真和重定向stderr和stdout
9. shell:是否通过shell执行命令
10. cwd:命令执行的工作目录
11. env:设置环境变量
12. universal_newlines:让返回数据以文本字符串输出 函数介绍 1. Popen.poll():检查子进程是否结束
2. Popen.wait():等待直到子进程结束
3. Popen.communicate():内部数据交互,将数据发送给stdin,返回stdout和stderr
4. Popen.send_signal():发送信号给子进程
5. Popen.terminate():终止子进程,unix下对应SIGTERM,windows下对应TerminateProcess()
6. Popen.kill():杀死子进程,unix下对应SIGKILL,windows下和terminate()一致 对象介绍 1. Popen.args:命令
2. Popen.stdout:命令的输出
3. Popen.stderr:命令的报错输出
4. Popen.stdin:命令接受的数据
5. Popen.pid:子进程的ID
6. Popen.returncode:返回值 """

实例

import subprocess as sp

#  父进程不等待子进程
p = sp.Popen('ls -l', shell=True, stdout=sp.PIPE, stderr=sp.PIPE) # 父进程等待子进程结束之后再继续运行
p = sp.Popen('ls -l', shell=True, stdout=sp.PIPE, stderr=sp.PIPE) p.wait() # 使用内容管理器
with Popen(["ls -l"], stdout=PIPE) as proc:
  print(proc.stdout.read())

注意

在使用管道(PIPE)输出stdout或者stderr时,请注意输出的数据量不能超过PIPE的上限,否则就会出现PIPE被阻塞,导致程序被阻塞无法继续运行,可以通过使用Popen.communicate()把stdout和stderr的输出存到内存中来缓解由于PIPE过小导致subprocess.Popen()无法继续运行程序的问题

Reference

subprocess 官方文档

Python编程之子进程管理(subprocess)详解的更多相关文章

  1. Python编程之列表操作实例详解【创建、使用、更新、删除】

    Python编程之列表操作实例详解[创建.使用.更新.删除] 这篇文章主要介绍了Python编程之列表操作,结合实例形式分析了Python列表的创建.使用.更新.删除等实现方法与相关操作技巧,需要的朋 ...

  2. python子进程模块subprocess详解与应用实例 之三

    二.应用实例解析 2.1 subprocess模块的使用 1. subprocess.call >>> subprocess.call(["ls", " ...

  3. python编程系列---args与kwargs详解

    args与kwargs详解 """ Process([group [, target [, name [, args [, kwargs]]]]]) - target:目 ...

  4. python子进程模块subprocess详解与应用实例 之一

    subprocess--子进程管理器 一.subprocess 模块简介 subprocess最早是在2.4版本中引入的. subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/ ...

  5. python子进程模块subprocess详解

    subprocess--子进程管理器一.subprocess 模块简介subprocess最早是在2.4版本中引入的.subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误, ...

  6. python子进程模块subprocess详解与应用实例 之二

    1.2. Popen 对象 Popen类的实例有下列方法: 1. Popen.poll() 检查子进程是否已经结束,设置并返回返回码值. 2. Popen.wait() 等待子进程结束,设置并返回返回 ...

  7. python 实用案例 supervisord管理进程详解

    Supervisor是由python语言编写,基于linux操作系统的一款服务器管理工具,用以监控服务器的运行,发现问题能立即自动预警及自动重启等功能.Supervisor类似于monit,monit ...

  8. Python Tkinter Grid布局管理器详解

    Grid(网格)布局管理器会将控件放置到一个二维的表格里.主控件被分割成一系列的行和列,表格中的每个单元(cell)都可以放置一个控件. 注意:不要试图在一个主窗口中混合使用pack和grid (1) ...

  9. Spring事务管理(详解+实例)

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

随机推荐

  1. Docker部署kafka|Go操作实践

    前言 写作本文的背景是由于字节的暑期青训营中,某个项目要求编写一个简易的流处理引擎(flink),开发语言不限,推荐Java,本着好奇心的驱使,我打算使用Go语言进行部分尝试. 既然是流处理引擎,那么 ...

  2. 我和Apache DolphinScheduler的这一年

    Apache DolphinScheduler,为Apache开源项目, 简称"DS", 中文名 "小海豚调度"(海豚聪明.人性化,又左右脑可互相换班,终生不用 ...

  3. DolphinScheduler 源码剖析之 Master 容错处理流程

    点击上方蓝字关注 Apache DolphinScheduler Apache DolphinScheduler(incubating),简称"DS", 中文名 "海豚调 ...

  4. 如果让我设计一套,TPS百万级API网关!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 是滴,小傅哥又要准备搞事情了!这次准备下手API网关项目,因为这是所有互联网大厂都有的一个核心 ...

  5. java-重载、包修饰词以及堆栈管理

    1.方法的重写(Override):重新写.覆盖 1)发生在父子类中,方法名称相同,参数列表相同,方法体不同 2)重写方法被调用时,看对象的类型2.重写与重载的区别: 1)重写(Override): ...

  6. Go语言Tips

    时间日期格式化 time.Now().Format("2006-01-02") 原生DefaultServeMux支持restful路由 ref: https://towardsd ...

  7. 将 Word 文本转换为表格

    文本转换为表格的功能,首先点击"插入"选项卡"表格"组中的"表格"下拉按钮,打开下拉列表中选择"文本转换成表格"选项.

  8. Web 布局设计(一):固定侧边栏

    前言 闲着无事,做一些实战练习,今天实现一个如标题所示的布局设计.通过此次布局设计,我希望掌握position属性值 fixed.absolute.relative.width和height属性值 i ...

  9. 【NOI P模拟赛】(要素过多的标题)(容斥原理)

    题面 0 题目背景 [ 数   据   删   除 ] _{^{[数\,据\,删\,除]}} [数据删除]​ 1 题目描述 在执行任务时,收集到了 n n n 份能源,其中第 i i i 份的能量值是 ...

  10. 066_末晨曦Vue技术_过渡 & 动画之多个元素的过渡

    多个元素的过渡 点击打开视频讲解更加详细 我们之后讨论多个组件的过渡,对于原生标签可以使用 v-if/v-else.最常见的多标签过渡是一个列表和描述这个列表为空消息的元素: <transiti ...