python模块之subprocess模块级方法的使用


Posted in Python onMarch 26, 2019

subprocess.run()

运行并等待args参数指定的指令完成,返回CompletedProcess实例。

参数:(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs)。除input, capture_output, timeout, check,其他参数与Popen构造器参数一致。

capture_output:如果设置为True,表示重定向stdout和stderr到管道,且不能再传递stderr或stdout参数,否则抛出异常。

input:input参数将作为子进程的标准输入传递给Popen.communicate()方法,必须是string(需要指定encoding或errors参数,或者设置text为True)或byte类型。非None的input参数不能和stdin参数一起使用,否则将抛出异常,构造Popen实例的stdin参数将指定为subprocess.PIPE。

timeout:传递给Popen.communicate()方法。

check:如果设置为True,进程执行返回非0状态码将抛出CalledProcessError异常。

# 源码

def run(*popenargs, input=None, capture_output=False, timeout=None, check=False, **kwargs):
  if input is not None:
    if 'stdin' in kwargs:
      raise ValueError('stdin and input arguments may not both be used.')
    kwargs['stdin'] = PIPE
  
  if capture_output:
    if ('stdout' in kwargs) or ('stderr' in kwargs):
      raise ValueError('stdout and stderr arguments may not be used '
               'with capture_output.')
    kwargs['stdout'] = PIPE
    kwargs['stderr'] = PIPE
  
  with Popen(*popenargs, **kwargs) as process:
    try:
      stdout, stderr = process.communicate(input, timeout=timeout)
    except TimeoutExpired:
      process.kill()
      stdout, stderr = process.communicate()
      raise TimeoutExpired(process.args, timeout, output=stdout,
                 stderr=stderr)
    except: # Including KeyboardInterrupt, communicate handled that.
      process.kill()
      # We don't call process.wait() as .__exit__ does that for us.
      raise
    retcode = process.poll()
    if check and retcode:
      raise CalledProcessError(retcode, process.args,
                   output=stdout, stderr=stderr)
  return CompletedProcess(process.args, retcode, stdout, stderr)

python3.5版本前,call(), check_all(), checkoutput()三种方法构成了subprocess模块的高级API。

subprocess.call()

运行并等待args参数指定的指令完成,返回执行状态码(Popen实例的returncode属性)。

参数:(*popenargs, timeout=None, **kwargs)。与Popen构造器参数基本相同,除timeout外的所有参数都将传递给Popen接口。

调用call()函数不要使用stdout=PIPE或stderr=PIPE,因为如果子进程生成了足量的输出到管道填满OS管道缓冲区,子进程将因不能从管道读取数据而导致阻塞。

# 源码
def call(*popenargs, timeout=None, **kwargs):
  with Popen(*popenargs, **kwargs) as p:
    try:
      return p.wait(timeout=timeout)
    except:
      p.kill()
      p.wait()
      raise

subprocess.check_call()

运行并等待args参数指定的指令完成,返回0状态码或抛出CalledProcessError异常,该异常的cmd和returncode属性可以查看执行异常的指令和状态码。

参数:(*popenargs, **kwargs)。全部参数传递给call()函数。

注意事项同call()

# 源码
def check_call(*popenargs, **kwargs):
  retcode = call(*popenargs, **kwargs)
  if retcode:
    cmd = kwargs.get("args")
    if cmd is None:
      cmd = popenargs[0]
    raise CalledProcessError(retcode, cmd)
  return 0

subprocess.check_output()

运行并等待args参数指定的指令完成,返回标准输出(CompletedProcess实例的stdout属性),类型默认是byte字节,字节编码可能取决于执行的指令,设置universal_newlines=True可以返回string类型的值。
如果执行状态码非0,将抛出CalledProcessError异常。

参数:(*popenargs, timeout=None, **kwargs)。全部参数传递给run()函数,但不支持显示地传递input=None继承父进程的标准输入文件句柄。

要在返回值中捕获标准错误,设置stderr=subprocess.STDOUT;也可以将标准错误重定向到管道stderr=subprocess.PIPE,通过CalledProcessError异常的stderr属性访问。

# 源码

def check_output(*popenargs, timeout=None, **kwargs):
  if 'stdout' in kwargs:
    raise ValueError('stdout argument not allowed, it will be overridden.')

  if 'input' in kwargs and kwargs['input'] is None:
    # Explicitly passing input=None was previously equivalent to passing an
    # empty string. That is maintained here for backwards compatibility.
    kwargs['input'] = '' if kwargs.get('universal_newlines', False) else b''

  return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
        **kwargs).stdout

subprocess模块还提供了python2.x版本中commands模块的相关函数。

subprocess.getstatusoutput(cmd)

实际上是调用check_output()函数,在shell中执行string类型的cmd指令,返回(exitcode, output)形式的元组,output(包含stderrstdout)是使用locale encoding解码的字符串,并删除了结尾的换行符。

# 源码
try:
  data = check_output(cmd, shell=True, universal_newlines=True, stderr=STDOUT)
  exitcode = 0
except CalledProcessError as ex:
  data = ex.output
  exitcode = ex.returncode
if data[-1:] == '\n':
  data = data[:-1]
return exitcode, data

subprocess.getoutput(cmd)

getstatusoutput()类似,但结果只返回output。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中as用法实例分析
Apr 30 Python
python使用PyGame模块播放声音的方法
May 20 Python
python&MongoDB爬取图书馆借阅记录
Feb 05 Python
Python 专题二 条件语句和循环语句的基础知识
Mar 19 Python
使用Python3制作TCP端口扫描器
Apr 17 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
python snownlp情感分析简易demo(分享)
Jun 04 Python
Python3 操作符重载方法示例
Nov 23 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
Python OpenCV实现鼠标画框效果
Aug 19 Python
利用python实现周期财务统计可视化
Aug 25 Python
解决tensorflow训练时内存持续增加并占满的问题
Jan 19 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 #Python
Python实现的矩阵转置与矩阵相乘运算示例
Mar 26 #Python
深度辨析Python的eval()与exec()的方法
Mar 26 #Python
详解Python locals()的陷阱
Mar 26 #Python
python 为什么说eval要慎用
Mar 26 #Python
Python eval的常见错误封装及利用原理详解
Mar 26 #Python
Python骚操作之动态定义函数
Mar 26 #Python
You might like
生成php程序的php代码
2008/04/07 PHP
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
轮播的简单实现方法
2016/07/28 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
Python去除字符串两端空格的方法
2015/05/21 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
Python reduce函数作用及实例解析
2020/05/08 Python
python中如何设置代码自动提示
2020/07/15 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
性能服装:HYLETE
2018/08/14 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
eBay美国官网:eBay.com
2020/10/24 全球购物
中学生期末评语
2014/02/03 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
调研报告的主要写法
2019/04/18 职场文书
Python 制作自动化翻译工具
2021/04/25 Python
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python