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脚本来获取Cisco设备信息的示例
May 04 Python
Python的Django框架中的表单处理示例
Jul 17 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 Python
Scrapy的简单使用教程
Oct 24 Python
pygame游戏之旅 创建游戏窗口界面
Nov 20 Python
pycharm打开命令行或Terminal的方法
Jan 16 Python
详解python tkinter教程-事件绑定
Mar 28 Python
Flask-WTF表单的使用方法
Jul 12 Python
python2与python3爬虫中get与post对比解析
Sep 18 Python
matplotlib.pyplot.matshow 矩阵可视化实例
Jun 16 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 Python
python 常见的反爬虫策略
Sep 27 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
基于empty函数的输出详解
2013/06/17 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
基于jquery的分页控件(C#)
2011/01/06 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
分享一些常用的jQuery动画事件和动画函数
2015/11/27 Javascript
Seajs是什么及sea.js 由来,特点以及优势
2016/10/13 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
Python 中如何写注释
2020/08/28 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
公益活动策划方案
2014/01/09 职场文书
无传销社区工作方案
2014/05/13 职场文书
公司节能减排方案
2014/05/16 职场文书
住房租房协议书
2014/08/20 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
教师党的群众路线学习心得体会
2014/11/04 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
如何自己动手写SQL执行引擎
2021/06/02 MySQL
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
浅谈Vue的computed计算属性
2022/03/21 Vue.js