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实现的简单模板引擎功能示例
Sep 02 Python
python MNIST手写识别数据调用API的方法
Aug 08 Python
python统计中文字符数量的两种方法
Jan 31 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
对python中的float除法和整除法的实例详解
Jul 20 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
Python脚本导出为exe程序的方法
Mar 25 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 Python
python爬虫破解字体加密案例详解
Mar 02 Python
利用Python第三方库实现预测NBA比赛结果
Jun 21 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 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_Flame(Version:Progress)的原代码
2006/10/09 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
自制PHP框架之设计模式
2017/05/07 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
Lazy Load 延迟加载图片的jQuery插件中文使用文档
2012/10/18 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
js实现符合国情的日期插件详解
2017/01/19 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
2019/01/31 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
使用Python实现一个简单的项目监控
2015/03/31 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
Python 列表反转显示的四种方法
2020/11/16 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
final, finally, finalize的区别
2012/03/01 面试题
优秀小学生家长评语
2014/01/30 职场文书
高等教育学自荐书范文
2014/02/10 职场文书
元宵晚会主持词
2014/03/25 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang