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模块学习 filecmp 文件比较
Aug 27 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
Python实现压缩与解压gzip大文件的方法
Sep 18 Python
关于python的bottle框架跨域请求报错问题的处理方法
Mar 19 Python
python try except 捕获所有异常的实例
Oct 18 Python
Django学习笔记之为Model添加Action
Apr 30 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
python常用函数与用法示例
Jul 02 Python
解决Python中pandas读取*.csv文件出现编码问题
Jul 12 Python
Python占用的内存优化教程
Jul 28 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
Feb 28 Python
django orm模块中的 is_delete用法
May 20 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遍历目录文件的常用方法小结
2017/02/03 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
js实现每日签到功能
2018/11/29 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
2019/07/30 Javascript
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
Python求两个list的差集、交集与并集的方法
2014/11/01 Python
Python中IPYTHON入门实例
2015/05/11 Python
Python pickle模块用法实例分析
2015/05/27 Python
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
2014年母亲节寄语
2014/05/07 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
汉字听写大会观后感
2015/06/12 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
如何书写授权委托书?
2019/06/25 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS