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字符串和字典相关操作的实例详解
Sep 23 Python
python3使用pyqt5制作一个超简单浏览器的实例
Oct 19 Python
python 浅谈serial与stm32通信的编码问题
Dec 18 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
浅谈python多线程和多线程变量共享问题介绍
Apr 17 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
Apr 24 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 Python
python flappy bird小游戏分步实现流程
Feb 15 Python
移除Selenium中window.navigator.webdriver值
Jun 10 Python
python如何读取和存储dict()与.json格式文件
Jun 25 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个人网站架设连环讲(三)
2006/10/09 PHP
discuz安全提问算法
2007/06/06 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
2015/03/25 PHP
php检测文本的编码
2015/07/26 PHP
网上抓的一个特效
2007/05/11 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
深入探究AngularJS框架中Scope对象的超级教程
2016/01/04 Javascript
通过正则表达式获取url中参数的简单实现
2016/06/07 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
AngularJS国际化详解及示例代码
2016/08/18 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
微信小程序点击控件修改样式实例详解
2017/07/07 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
详解jenkins自动化部署vue
2019/05/14 Javascript
前端路由&webpack基础配置详解
2019/06/10 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
pygame播放音乐的方法
2015/05/19 Python
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
django连接mysql配置方法总结(推荐)
2018/08/18 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
深入了解NumPy 高级索引
2020/07/24 Python
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
幼儿园中秋节活动反思
2014/02/16 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
2016年小学生新年寄语
2015/08/18 职场文书
Python可视化神器pyecharts绘制水球图
2022/07/07 Python