python中执行shell的两种方法总结

一、使用python内置commands模块执行shell

commands对Python的os.popen()进行了封装,使用SHELL命令字符串作为其参数,返回命令的结果数据以及命令执行的状态;

该命令目前已经废弃,被subprocess所替代;


    # coding=utf-8
    '''
    Created on 2013年11月22日

    @author: crazyant.net
    '''
    import commands
    import pprint

    def cmd_exe(cmd_String):
      print "will exe cmd,cmd:"+cmd_String
      return commands.getstatusoutput(cmd_String)

    if __name__=="__main__":
      pprint.pprint(cmd_exe("ls -la"))

二、使用python最新的subprocess模块执行shell

Python目前已经废弃了os.system,os.spawn,os.popen,popen2.,commands.来执行其他语言的命令,subprocesss是被推荐的方法;

subprocess允许你能创建很多子进程,创建的时候能指定子进程和子进程的输入、输出、错误输出管道,执行后能获取输出结果和执行状态。


    # coding=utf-8
    '''
    Created on 2013年11月22日

    @author: crazyant.net
    '''
    import shlex
    import datetime
    import subprocess
    import time

    def execute_command(cmdstring, cwd=None, timeout=None, shell=False):
      """执行一个SHELL命令
          封装了subprocess的Popen方法, 支持超时判断,支持读取stdout和stderr
          参数:
        cwd: 运行命令时更改路径,如果被设定,子进程会直接先更改当前路径到cwd
        timeout: 超时时间,秒,支持小数,精度0.1秒
        shell: 是否通过shell运行
      Returns: return_code
      Raises: Exception: 执行超时
      """
      if shell:
        cmdstring_list = cmdstring
      else:
        cmdstring_list = shlex.split(cmdstring)
      if timeout:
        end_time = datetime.datetime.now() + datetime.timedelta(seconds=timeout)

      #没有指定标准输出和错误输出的管道,因此会打印到屏幕上;
      sub = subprocess.Popen(cmdstring_list, cwd=cwd, stdin=subprocess.PIPE,shell=shell,bufsize=4096)

      #subprocess.poll()方法:检查子进程是否结束了,如果结束了,设定并返回码,放在subprocess.returncode变量中 
      while sub.poll() is None:
        time.sleep(0.1)
        if timeout:
          if end_time <= datetime.datetime.now():
            raise Exception("Timeout:%s"%cmdstring)

      return str(sub.returncode)

    if __name__=="__main__":
      print execute_command("ls")

也可以在Popen中指定stdin和stdout为一个变量,这样就能直接接收该输出变量值。

总结

在python中执行SHELL有时候也是很必须的,比如使用Python的线程机制启动不同的shell进程,目前subprocess是Python官方推荐的方法,其支持的功能也是最多的,推荐大家使用。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

将字符串与数据一起组成一个字符串

在Python中一般连接字符串与字符串,我们用+操作符,但当+操作符连接的是数字与字符串时则会报错,解决办法就是用str将数字转为字符串,比如: import sys def outputNumb...

发布于:1年以前  |  1431次阅读  |  详细内容 »

Python文件格式

第一行指定脚本解析器为Python:#!/usr/bin/python表示要用/usr/bin下面的程序(工具)python,这个解释器,来解释python脚本,来运行python脚本的。 第二行指定文件编码。 ...

发布于:1年以前  |  1382次阅读  |  详细内容 »

使用C语言扩展Python程序的简单入门指引

一、简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并...

发布于:1年以前  |  1290次阅读  |  详细内容 »

Python编码类型转换方法详解

本文实例讲述了Python编码类型转换方法。分享给大家供大家参考,具体如下: 1:Python和unicode 为了正确处理多语言文本,Python在2.0版后引入了Unicode字符串。 2:python...

发布于:1年以前  |  1320次阅读  |  详细内容 »

python中执行shell的两种方法总结

一、使用python内置commands模块执行shell commands对Python的os.popen()进行了封装,使用SHELL命令字符串作为其参数,返回命令的结果数据以及命令执行的状态; 该命令目前...

发布于:1年以前  |  1576次阅读  |  详细内容 »

Python字符串格式化输出方法分析

本文实例分析了Python字符串格式化输出方法。分享给大家供大家参考,具体如下: 我们格式化构建字符串可以有3种方法: 1 元组占位符 m = &#039;python&#039; astr = &#039;i love...

发布于:1年以前  |  1050次阅读  |  详细内容 »

Python设置默认编码为utf8的方法

本文实例讲述了Python设置默认编码为utf8的方法。分享给大家供大家参考,具体如下: 这是Python的编码问题,设置python的默认编码为utf8 python安装目录:/etc/python2.x/s...

发布于:1年以前  |  1389次阅读  |  详细内容 »

Python中为什么要用self探讨

Python要self的理由 Python的类的方法和普通的函数有一个很明显的区别,在类的方法必须有个额外的第一个参数 (self ),但在调用这个方法的时候不必为这个参数赋值 (显胜于...

发布于:1年以前  |  1103次阅读  |  详细内容 »

Python中几种导入模块的方式总结

模块内部封装了很多实用的功能,有时在模块外部调用就需要将其导入。常见的方式有如下几种: 1 . import &gt;&gt;&gt; import sys &gt;&gt;&gt; sys.path [&#039;&#039;, &#039;C:\\Python34\\L...

发布于:1年以前  |  670次阅读  |  详细内容 »

Python 2与Python 3版本和编码的对比

一、版本对比 首先要说的是,Python的版本,目前主要分为两大类: Python 2.x的版本的,被称为Python2:是目前用的最广泛的,比如Python 2.7.3。 Python 3.x的版本的,被称...

发布于:1年以前  |  1794次阅读  |  详细内容 »

最多阅读

Python 2与Python 3版本和编码的对比 1年以前  |  1794次阅读
python中执行shell的两种方法总结 1年以前  |  1576次阅读
Python设置默认编码为utf8的方法 1年以前  |  1389次阅读
Python文件格式 1年以前  |  1382次阅读
Python编码类型转换方法详解 1年以前  |  1320次阅读
Python中为什么要用self探讨 1年以前  |  1103次阅读
将字符串写入到文件中 1年以前  |  1052次阅读
Python字符串格式化输出方法分析 1年以前  |  1050次阅读
Python中几种导入模块的方式总结 1年以前  |  670次阅读