python subprocess模块详解
一、subprocess标准库
python执行shell脚本,通常会使用so模块中的几个方法,如system、spawn*、popen等。subprocess标准库的引入就是为了取代这些老的模块方法。subprocess使用时,父进程创建子进程去执行一个外部程序,并提供了标准输入输出和管道(pipe)的实现方法。
subprocess.Popen()
subprocess库的一个基础类,下文介绍的subprocess.run、subprocess.call、subprocess.check_call、subprocess.check_output都是在此基础上的封装,若要实现一些复杂的业务流程使用subprocess.Popen()更灵活。
程序运行subprocess.Popen()类,父进程创建子进程后,不会等待子进程执行完成。如果需要等待子进程,需要加入wait()方法阻塞父进程。
示例1
child = subprocess.Popen('ping www.baidu.com')
print('End')
示例2
child = subprocess.Popen('ping www.baidu.com')
child.wait()
print('End')
以上示例1没有等child 执行完就print,示例2父进程先阻塞,等待child执行完再print。
subprocess.Popen(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:shell命令,可以是str类型,或者list和tuple
bufsize:缓冲区
stdin、stdout、stderr:标准输入输出和标准错误日志
subprocess.PIPE:创建Popen对象时,subprocess.PIPE可以初始化stdin、stdout、stderr参数。
标准输出:
import subprocess child = subprocess.Popen(['shell','python --version'], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr= subprocess.PIPE)
shell_out = child.stdout.read()
# shell_out = child.communicate() 也可以使用communicate()方法输出
shell_error = child.stderr.read()
print(shell_out)
print(shell_error)
其他方法:
child.poll() #检查子进程状态 child.kill() #终止子进程 child.send_signal() #向子进程发送信号 child.terminate() #终止子进程
subprocess.run()
subprocess.run()函数是Python3.5中新增的一个高级函数,其返回值是一个subprocess.CompletedPorcess类的实例。
child = subprocess.run('python --version', shell =True)
print(child)
#CompletedProcess(args='python --version', returncode=0)
subprocess.call()
父进程等待子进程完成
执行成功返回0
执行失败returncode=2,不会主动抛error
child = subprocess.call('python --version', shell =True)
print(child)
#
subprocess.check_call()
父进程等待子进程完成
执行成功返回0
returncode不为0,抛出subprocess.CalledProcessError:error信息只有returncode
child = subprocess.check_call('python --version', shell =True)
print(child)
#
subprocess.check_output()
父进程等待子进程完成
执行成功返回output信息
returncode不为0,抛出subprocess.CalledProcessError:error信息包含returncode和output信息
child = subprocess.check_output('python --version', shell =True)
print(child)
#b'Python 3.6.4\r\n'
python subprocess模块详解的更多相关文章
- python time模块详解
python time模块详解 转自:http://blog.csdn.net/kiki113/article/details/4033017 python 的内嵌time模板翻译及说明 一.简介 ...
- python docopt模块详解
python docopt模块详解 docopt 本质上是在 Python 中引入了一种针对命令行参数的形式语言,在代码的最开头使用 """ ""&q ...
- (转)python collections模块详解
python collections模块详解 原文:http://www.cnblogs.com/dahu-daqing/p/7040490.html 1.模块简介 collections包含了一些特 ...
- python pathlib模块详解
python pathlib模块详解
- Python Fabric模块详解
Python Fabric模块详解 什么是Fabric? 简单介绍一下: Fabric是一个Python的库和命令行工具,用来提高基于SSH的应用部署和系统管理效率. 再具体点介绍一下,Fabri ...
- python time 模块详解
Python中time模块详解 发表于2011年5月5日 12:58 a.m. 位于分类我爱Python 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括: ...
- python之subprocess模块详解--小白博客
subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码.这个模 ...
- python常用模块详解
python常用模块详解 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用p ...
- subprocess模块详解
subprocess是Python与系统交互的一个库,该模块允许生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回代码. 该模块旨在替换几个较旧的模块和功能: os.system os.s ...
随机推荐
- 64位Redhat系统应用(c++代码)搭建-使用informix和g++编译
这篇博客很有必要写下来,记录我在一个比较原生的Linux系统上搭建一套应用所遇到的各种问题和各种坑. 关于这套应用,算是我离职前的一个项目,不完成的话没有办法交差,同时,这个项目也比较紧,合作行一直在 ...
- HTML5表单_form
原则:能让用户选择的决不填写,增加用户体验 表单(form)元素格式 <input type="text" name="fname" value=&quo ...
- 受欢迎的牛[HAOI2006]
--BZOJ1051 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎, ...
- 安装配置python环境,并跑一个推荐系统的例子
1.官网下载python2.7,安装完后,在环境变量Path中加上这个路径 在控制台输入python,出现版本信息,就成功了. 2.我使用的是 pycharm,注册后,在 把自己的python.exe ...
- 设置DataGridView中表头颜色
默认的DataGridView表头颜色实在不是太好看,想设置下,上google搜了一通, 都说这样设置 this.dataGridView1.ColumnHeadersDefaultCellStyle ...
- SQL SERVER 小语法
1. 取字段长度:len select * from 表名 where len(expmessage)=1 2.rtrim, ltrim rtrim(ObjectName)
- mysql 在原有的时间上加10个月或者一年
UPDATE SERVER_TIME_LEFT SET END_TIME = DATE_ADD(END_TIME, INTERVAL 10 MONTH) WHERE SHOP_ID BETWEEN 1 ...
- 利用foo函数的Bof漏洞攻击:构造攻击字符串
利用foo函数的Bof漏洞攻击:构造攻击字符串 一.基础知识储备 objdump反汇编指令.gdb函数调试运行.Perl语言.|管道符 二.实验步骤 1. 通过反汇编了解程序功能及代码 ①反汇编查看文 ...
- Request参数值自动去空格
/// <summary> /// TypeTrimHelper /// </summary> public static class TypeTrimHelper { /// ...
- MyBatis 源码分析 - 配置文件解析过程
* 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ...