zoukankan      html  css  js  c++  java
  • Python中执行外部命令

       有很多需求需要在Python中执行shell命令、启动子进程,并捕获命令的输出和退出状态码,类似于Java中的Runtime类库。

    subprocess模块的使用:

      Python使用最广泛的是标准库的subprocess模块,用来替换os.system(),os.spawn*(),os.popen*()和commands.*等模块与函数。

    使用subprocess最简单的方式就是用它提供的便利函数,call,check_all与check_output,当便利函数满足不了要求再使用Popen类。

    1. call 

    subprocess(args,*,stdin=None,stout=None,stderr=None,shell=False)

    shell=True,Python会先运行一个shell,再用shell解释字符串,而不是传递一个列表。

    2. check_call

       check_all与call类似,只是遇到异常情况返回的形式不同,它会抛出subprocess.CalledProcessError异常

    3. check_output

       这个便利函数是使用最多了,它可以获取命令的结果,而不是退出状态码

    如果想要捕捉退出状态码,可以通过抛出的subprocess.CalledProcessError异常

    import subprocess
    try:
        output = subprocess.check_output('ls /zz',shell=True)
    except subprocess.CalledProcessError as e:
        output = e.output
        code = e.returncode
        print (code,output)
    

     执行结果:

    如果想捕获命令的错误输出,需将错误输出重定向到标准输出

    subprocess.check_output(['cmd','arg1','arg2'],stderr=subprocess.STDOUT)

    4. 使用Popen

    下面的exexute_cmd函数对Popen,进行了封装,执行成功,返回标准输出和状态码,失败是返回状态码和错误输出。

    #!/usr/bin/python
    #coding=utf8
    import subprocess
    
    def execute_cmd(cmd):
            p = subprocess.Popen(cmd,
                                 shell=True,
                                 stdin=subprocess.PIPE,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE)
            stdout, stderr = p.communicate()
            if p.returncode != 0:
                   return p.returncode, stderr
            return p.returncode, stdout
    
    if __name__=='__main__':
        cmd='ls /u01'
        returncode,out=execute_cmd(cmd)
        if returncode != 0:
            raise SystemExit('execute {0} err :{1}'.format(cmd,out))
        else:
           print("execute command ({0} sucessful)".format(cmd))
    

      

    目录不存时:

      

  • 相关阅读:
    不通过App Store,在iOS设备上直接安装应用程序(转)
    Quest Central for DataBase 5.0.1,6.1 (软件+注册)
    微信公众号自定义菜单与关键词自动回复互斥解决
    转载《Spring AOP中pointcut expression表达式解析 及匹配多个条件》
    ssm 动态切换数据源
    spring aop
    微信公众号自动回复
    转载《spring定时任务轮询(spring Task)》
    N 秒打开一个新窗口
    java webservice maven spring Class Not Found Exception解决
  • 原文地址:https://www.cnblogs.com/zydev/p/8673620.html
Copyright © 2011-2022 走看看