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


Posted in Python onJanuary 10, 2017

一、使用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 相关文章推荐
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
May 22 Python
解决python报错MemoryError的问题
Jun 26 Python
用python实现k近邻算法的示例代码
Sep 06 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
django2笔记之路由path语法的实现
Jul 17 Python
Django上使用数据可视化利器Bokeh解析
Jul 31 Python
Python实现EM算法实例代码
Oct 04 Python
常用的Python代码调试工具总结
Jun 23 Python
详解Python为什么不用设计模式
Jun 24 Python
Python使用openpyxl模块处理Excel文件
Jun 05 Python
Python用list或dict字段模式读取文件的方法
Jan 10 #Python
python导入时小括号大作用
Jan 10 #Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 #Python
ubuntu系统下 python链接mysql数据库的方法
Jan 09 #Python
利用Python中unittest实现简单的单元测试实例详解
Jan 09 #Python
Python中的sort()方法使用基础教程
Jan 08 #Python
Python守护进程和脚本单例运行详解
Jan 06 #Python
You might like
深入extjs与php参数交互的详解
2013/06/25 PHP
PHP迭代器的内部执行过程详解
2013/11/12 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
纯js网页画板(Graphics)类简介及实现代码
2012/12/24 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
JS画线(实例代码)
2013/11/20 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
jQuery数据缓存用法分析
2015/02/20 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
python让列表倒序输出的实例
2018/06/25 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
如何在python中写hive脚本
2019/11/08 Python
利用python实现逐步回归
2020/02/24 Python
用 python 进行微信好友信息分析
2020/11/28 Python
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
大学生的网络创业计划书
2013/12/26 职场文书
cf战队收人广告词
2014/03/14 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
学生党员检讨书范文
2014/12/27 职场文书
跑出一片天观后感
2015/06/08 职场文书
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫