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

阅读次数:1444 次  |  发布时间:2019-02-04T00:00:00Z 

一、使用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 程序  |  30次阅读  | 发布于:2020-07-29T17:47:44Z
list 等分 n 组 Python 程序  |  21次阅读  | 发布于:2020-06-27T22:56:55Z
斐波那契数列前n项 Python 程序  |  14次阅读  | 发布于:2020-06-27T22:56:39Z
提取完整文件名 Python 程序  |  13次阅读  | 发布于:2020-06-27T22:56:22Z
提取后缀名 Python 程序  |  20次阅读  | 发布于:2020-06-27T22:56:11Z
Python写文件 Python 程序  |  16次阅读  | 发布于:2020-06-27T22:56:01Z
with 读写文件 Python 程序  |  15次阅读  | 发布于:2020-06-27T22:55:29Z
判断是否为闰年 Python 程序  |  14次阅读  | 发布于:2020-06-27T22:55:19Z
年的日历图 Python 程序  |  13次阅读  | 发布于:2020-06-27T22:54:44Z
时间字符串转时间结构体 Python 程序  |  15次阅读  | 发布于:2020-06-27T22:54:30Z
时间结构体转指定格式时间字符串 Python 程序  |  11次阅读  | 发布于:2020-06-27T22:54:17Z
时间结构体转时间字符串 Python 程序  |  16次阅读  | 发布于:2020-06-27T22:54:05Z
浮点数转时间结构体 Python 程序  |  14次阅读  | 发布于:2020-06-27T22:53:28Z
使用time模块打印当前时间 Python 程序  |  18次阅读  | 发布于:2020-06-27T22:53:17Z
反转字符串 Python 程序  |  16次阅读  | 发布于:2020-06-27T22:52:57Z
replace 替换 Python 程序  |  16次阅读  | 发布于:2020-06-27T22:52:45Z
split 分割** Python 程序  |  11次阅读  | 发布于:2020-06-27T22:52:34Z
链式操作 Python 程序  |  15次阅读  | 发布于:2020-06-27T22:52:23Z
链式比较 Python 程序  |  12次阅读  | 发布于:2020-06-27T22:52:13Z
过滤器:函数通过 lambda 表达式设定过滤条件,保留 lambda 表达式为True的元素 Python 程序  |  8次阅读  | 发布于:2020-06-27T22:51:52Z
打包聚合各个可迭代对象的迭代器 Python 程序  |  12次阅读  | 发布于:2020-06-27T22:51:23Z
反向遍历数组 Python 程序  |  13次阅读  | 发布于:2020-06-27T22:51:04Z
创建range迭代器 Python 程序  |  16次阅读  | 发布于:2020-06-27T22:50:33Z
创建迭代器 Python 程序  |  14次阅读  | 发布于:2020-06-27T22:49:15Z
Python 的枚举对象 Python 程序  |  16次阅读  | 发布于:2020-06-27T22:49:04Z
一键查看对象所有方法 Python 程序  |  12次阅读  | 发布于:2020-06-27T22:48:49Z
证明object 是所有类的基类 Python 程序  |  14次阅读  | 发布于:2020-06-27T22:48:21Z
对象父子关系鉴定 Python 程序  |  10次阅读  | 发布于:2020-06-27T22:47:59Z
isinstance:判断object是否为classinfo的实例,是返回true Python 程序  |  17次阅读  | 发布于:2020-06-27T22:47:31Z
对象是否有某个属性 Python 程序  |  14次阅读  | 发布于:2020-06-27T22:47:11Z

最多阅读的代码

 Python 2与Python 3版本和编码的对比 Python 程序  |  1559次阅读
 python中执行shell的两种方法总结 Python 程序  |  1444次阅读
 将字符串与数据一起组成一个字符串 Python 程序  |  1322次阅读
 Python设置默认编码为utf8的方法 Python 程序  |  1273次阅读
 Python文件格式 Python 程序  |  1173次阅读
 使用C语言扩展Python程序的简单入门指引 Python 程序  |  1105次阅读
 Python编码类型转换方法详解 Python 程序  |  1104次阅读
 Python中为什么要用self探讨 Python 程序  |  976次阅读
 将字符串写入到文件中 Python 程序  |  973次阅读
 Python字符串格式化输出方法分析 Python 程序  |  880次阅读
 Python八进制字符吕转utf-8编码的中文 Python 程序  |  568次阅读
 Python中几种导入模块的方式总结 Python 程序  |  521次阅读
 python实现水仙花数 Python 程序  |  118次阅读
 使用正则多个分隔符分割字符串 Python 程序  |  97次阅读
 Python启动web服务的最快姿势 Python 程序  |  93次阅读
 python使用urllib下载文件 Python 程序  |  81次阅读
 打印99乘法表 Python 程序  |  74次阅读
 打印python之禅 Python 程序  |  72次阅读
 一行代码画爱心 Python 程序  |  71次阅读
 字符串转换为JSON Python 程序  |  70次阅读
 使用pickle存储对象 Python 程序  |  68次阅读
 发送各种类型邮件 Python 程序  |  65次阅读
 使用groupby将列表元素分类 Python 程序  |  63次阅读
 正则 调整文本格式 Python 程序  |  63次阅读
 使用装饰器计算函数运行时间 Python 程序  |  60次阅读
 使用sets计算交集和差集 Python 程序  |  58次阅读
 使用正则表达式提取文本 Python 程序  |  54次阅读