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中sleep函数用法实例分析
Apr 29 Python
九步学会Python装饰器
May 09 Python
详解Python的Django框架中的templates设置
May 11 Python
在Python中的Django框架中进行字符串翻译
Jul 27 Python
Python生成器定义与简单用法实例分析
Apr 30 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
python实现PCA降维的示例详解
Feb 24 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
Python新手学习函数默认参数设置
Jun 03 Python
django 将自带的数据库sqlite3改成mysql实例
Jul 09 Python
Django model class Meta原理解析
Nov 14 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
PHP编程中字符串处理的5个技巧小结
2007/11/13 PHP
js下函数般调用正则的方法附代码
2008/06/22 PHP
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
CI框架AR数据库操作常用函数总结
2016/11/21 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
2016/07/01 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
vue的滚动条插件实现代码
2019/09/07 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
JavaScript判断数据类型有几种方法及区别介绍
2020/09/02 Javascript
python抓取网页中的图片示例
2014/02/28 Python
python调用java的Webservice示例
2014/03/10 Python
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
python使用列表的最佳方案
2020/08/12 Python
Python基于内置函数type创建新类型
2020/10/22 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
台湾深度自由行旅游平台:Tripbaa趣吧
2017/10/10 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
有关打架的检讨书
2014/01/25 职场文书
潘婷洗发水广告词
2014/03/14 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
给老婆的检讨书
2015/01/27 职场文书
讲文明倡议书
2015/04/29 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python
Flask搭建一个API服务器的步骤
2021/05/28 Python
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js