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采用raw_input读取输入值的方法
Aug 18 Python
Python线程中对join方法的运用的教程
Apr 09 Python
对于Python装饰器使用的一些建议
Jun 03 Python
浅析Python基础-流程控制
Mar 18 Python
Python人脸识别初探
Dec 21 Python
python写一个md5解密器示例
Feb 23 Python
用TensorFlow实现多类支持向量机的示例代码
Apr 28 Python
Python 读写文件的操作代码
Sep 20 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
Django框架模型简单介绍与使用分析
Jul 18 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
Python 操作 MySQL数据库
Sep 18 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中逗号与点号的区别
2013/08/05 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
php解决约瑟夫环示例
2014/04/09 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
js的[defer]和[async]属性
2014/11/24 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
前台文员的岗位职责
2013/11/14 职场文书
银行奉献演讲稿
2014/09/16 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
小学生组织委员竞选稿
2015/11/21 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
详解Vue的列表渲染
2021/11/20 Vue.js