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中的CURL PycURL使用例子
Jun 01 Python
Python解析网页源代码中的115网盘链接实例
Sep 30 Python
Python中用Spark模块的使用教程
Apr 13 Python
Python使用Supervisor来管理进程的方法
May 28 Python
Python爬取网易云音乐上评论火爆的歌曲
Jan 19 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
python 画二维、三维点之间的线段实现方法
Jul 07 Python
python查看数据类型的方法
Oct 12 Python
Python3列表List入门知识附实例
Feb 09 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
Mar 08 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
python中urllib包的网络请求教程
Apr 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 CLI模式下的多进程应用分析
2013/06/03 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
jquery 批量上传图片实现代码
2010/01/28 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
JS实现给数组对象排序的方法分析
2019/06/24 Javascript
js实现内置计时器
2019/12/16 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
python编程开发之类型转换convert实例分析
2015/11/13 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
员工自我鉴定范文
2013/10/06 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
个人职业及收入证明
2014/10/13 职场文书
物业保洁员管理制度
2015/08/05 职场文书
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers