设为首页 收藏本站
查看: 851|回复: 0

[经验分享] Python标准库 - subprocess

[复制链接]

尚未签到

发表于 2018-8-8 08:46:07 | 显示全部楼层 |阅读模式
  编写Python脚本时, 经常要执行Linux操作系统命令, 如mkdir zzzz. 目前比较推荐的方法是使用subprocess模块.
  通过该模块的帮助文档, 可看到其主要提供了4个API, 和相应的使用说明.
  Main API
  ========
  call(...): Runs a command, waits for it to complete, then returns
  the return code.
  check_call(...): Same as call() but raises CalledProcessError()
  if return code is not 0
  check_output(...): Same as check_call() but returns the contents of
  stdout instead of a return code

  Popen(...): A>  结合API的说明来看, 若执行简单的命令, 像前面所说mkdir zzzz, 前三个API都可以, 只是处理细节稍有不同.
  In [54]: subprocess.call("mkdir /tmp/zzzz", shell=True)
  Out[54]: 0
  In [55]: subprocess.call("mkdir /tmp/zzzz", shell=True)
  mkdir: cannot create directory `/tmp/zzzz': File exists
  Out[55]: 1
  In [56]: subprocess.check_call("mkdir /tmp/zzzz", shell=True)
  Out[56]: 0
  In [57]: subprocess.check_call("mkdir /tmp/zzzz", shell=True)
  mkdir: cannot create directory `/tmp/zzzz': File exists
  ---------------------------------------------------------------------------
  CalledProcessError                        Traceback (most recent call last)
  <ipython-input-57-2a531671f16e> in <module>()
  ----> 1 subprocess.check_call(&quot;mkdir /tmp/zzzz&quot;, shell=True)
  /usr/local/python27/lib/python2.7/subprocess.pyc in check_call(*popenargs, **kwargs)
  184         if cmd is None:
  185             cmd = popenargs[0]
  --> 186         raise CalledProcessError(retcode, cmd)
  187     return 0
  188
  CalledProcessError: Command 'mkdir /tmp/zzzz' returned non-zero exit status 1
  In [59]: subprocess.check_output(&quot;mkdir /tmp/zzzz&quot;, shell=True)
  Out[59]: ''
  In [60]: subprocess.check_output(&quot;mkdir /tmp/zzzz&quot;, shell=True)
  mkdir: cannot create directory `/tmp/zzzz': File exists
  ---------------------------------------------------------------------------
  CalledProcessError                        Traceback (most recent call last)
  <ipython-input-60-4911eea4ecd3> in <module>()
  ----> 1 subprocess.check_output(&quot;mkdir /tmp/zzzz&quot;, shell=True)
  /usr/local/python27/lib/python2.7/subprocess.pyc in check_output(*popenargs, **kwargs)
  217         if cmd is None:
  218             cmd = popenargs[0]
  --> 219         raise CalledProcessError(retcode, cmd, output=output)
  220     return output
  221
  CalledProcessError: Command 'mkdir /tmp/zzzz' returned non-zero exit status 1
  又若执行复杂的命令或脚本, 需要获取其标准输出, 和标准错误输出, 就要用到Popen接口了. 前三个API, 其实是第四个的简化版, 是将参数直接传给了Popen的构造函数, 不过大部分参数都是保留了默认值, 来看下该构造函数的样子.
  def __init__(self, args, bufsize=0, executable=None,
  stdin=None, stdout=None, stderr=None,
  preexec_fn=None, close_fds=False, shell=False,
  cwd=None, env=None, universal_newlines=False,
  startupinfo=None, creationflags=0):
  注意参数shell=False, 其含义为, 是否将args(要执行的命令)置于操作系统的shell环境中运行.
  下面给出一个代码段, 用到了Popen, 算是对subprocess模块的小结.
  #!/usr/bin/env python
  # -*- coding: utf-8 -*-
  import subprocess
  def exec_cmd(cmd):
  proc = subprocess.Popen(cmd, stdout=subprocess.PIPE,
  stderr=subprocess.PIPE, shell=True)
  stdout, stderr = proc.communicate()
  if proc.returncode != 0:
  return proc.returncode, stderr
  return proc.returncode, stdout
  def main():
  cmd = &quot;ls -l&quot;
  # cmd = &quot;ls -lz&quot;
  returncode, stdoutdata = exec_cmd(cmd)
  print str(returncode) + &quot; - &quot; + stdoutdata
  if __name__ == '__main__':
  main()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548446-1-1.html 上篇帖子: Python标准库 - subprocess 下篇帖子: Python(入门小练习2)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表