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中使用swapCase()方法转换大小写的教程
May 20 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
May 16 Python
快速了解python leveldb
Jan 18 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
对python:print打印时加u的含义详解
Dec 15 Python
Selenium python时间控件输入问题解决方案
Jul 22 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 Python
Python控制鼠标键盘代码实例
Dec 08 Python
Python+Xlwings 删除Excel的行和列
Dec 19 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 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
用Flash图形化数据(二)
2006/10/09 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
JQuery对checkbox操作 (循环获取)
2011/05/20 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
javascript工具库代码
2012/03/29 Javascript
jQuery实现 注册时选择阅读条款 左右移动
2013/04/11 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
2014/09/02 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
基于JavaScript实现动态创建表格和增加表格行数
2015/12/20 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
2017/03/02 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
Vue 实例中使用$refs的注意事项
2021/01/29 Vue.js
python插入排序算法的实现代码
2013/11/21 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
精选干货:Java精选笔试题附答案
2014/01/18 面试题
旅游管理毕业生自荐信
2013/11/05 职场文书
产品销售员岗位职责
2013/12/18 职场文书
会计电算化大学生职业规划书
2014/02/05 职场文书
励志演讲稿800字
2014/08/21 职场文书
营业用房租赁协议书
2014/11/26 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS