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入门及进阶笔记 Python 内置函数小结
Aug 09 Python
Python常用模块用法分析
Sep 08 Python
Python多线程编程(一):threading模块综述
Apr 05 Python
Windows下搭建python开发环境详细步骤
Jul 20 Python
Python快速从注释生成文档的方法
Dec 26 Python
基于python(urlparse)模板的使用方法总结
Oct 13 Python
Python3 SSH远程连接服务器的方法示例
Dec 29 Python
python基于递归解决背包问题详解
Jul 03 Python
如何在django中运行scrapy框架
Apr 22 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
Python代码需要缩进吗
Jul 01 Python
Python基础之常用库常用方法整理
Apr 30 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
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
PHP微信支付结果通知与回调策略分析
2019/01/10 PHP
JavaScript 动态创建VML的方法
2009/10/14 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
Javascript 链式作用域详细介绍
2017/02/23 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
javascript判断一个变量是数组还是对象
2019/04/10 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
Python reduce()函数的用法小结
2017/11/15 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
Why we need EJB
2016/10/20 面试题
在职人员函授期间自我评价分享
2013/11/08 职场文书
自我鉴定 电子商务专业
2014/01/30 职场文书
学生手册家长评语
2014/02/10 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
企业文化学习心得体会
2016/01/21 职场文书
调解协议书范本
2016/03/21 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
代码解析React中setState同步和异步问题
2021/06/03 Javascript
详解CSS3浏览器兼容
2022/12/24 HTML / CSS