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遍历序列enumerate函数浅析
Oct 17 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
Python unittest 简单实现参数化的方法
Nov 30 Python
python实现烟花小程序
Jan 30 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
Python 操作 ElasticSearch的完整代码
Aug 04 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
Python的scikit-image模块实例讲解
Dec 30 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
python+playwright微软自动化工具的使用
Feb 02 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页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
php猜单词游戏
2015/09/29 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
js获取select标签的值且兼容IE与firefox
2013/12/30 Javascript
js对象的复制继承实例
2015/01/10 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
JS中去掉array中重复元素的方法
2017/05/26 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
Python内置random模块生成随机数的方法
2019/05/31 Python
基于python2.7实现图形密码生成器的实例代码
2019/11/05 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
Hudson Jeans官网:高级精制牛仔裤
2018/11/28 全球购物
神路信息Java面试题目
2013/03/31 面试题
CSMA/CD介质访问控制协议
2015/11/17 面试题
护理专业毕业生自我鉴定
2013/10/08 职场文书
旅游管理专业大学生职业规划书
2014/02/27 职场文书
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
订货会邀请函
2015/01/31 职场文书
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis