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 相关文章推荐
wxPython窗口的继承机制实例分析
Sep 28 Python
Python3之读取连接过的网络并定位的方法
Apr 22 Python
Python退火算法在高次方程的应用
Jul 26 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
Django框架使用mysql视图操作示例
May 15 Python
python中比较两个列表的实例方法
Jul 04 Python
python实现二分类的卡方分箱示例
Nov 22 Python
使用Python脚本从文件读取数据代码实例
Jan 19 Python
Django models filter筛选条件详解
Mar 16 Python
Django框架获取form表单数据方式总结
Apr 22 Python
python各种excel写入方式的速度对比
Nov 10 Python
python字符串的多行输出的实例详解
Jun 08 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/04/24 PHP
初识php MVC
2014/09/10 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
newxtree.js代码
2007/03/13 Javascript
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
element ui 对话框el-dialog关闭事件详解
2018/02/26 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
vue生命周期与钩子函数简单示例
2019/03/13 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
Python实现list反转实例汇总
2014/11/11 Python
详解Python中的type()方法的使用
2015/05/21 Python
Python实现字符串格式化输出的方法详解
2017/09/20 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
django中间键重定向实例方法
2019/11/10 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
HTML5输入框下拉菜单功能的示例代码
2020/09/08 HTML / CSS
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
护士见习期自我鉴定
2014/02/08 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
奖学金申请书(范文)
2019/08/14 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python
分享python函数常见关键字
2022/04/26 Python