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实现命令行版的火车票查看器
Aug 05 Python
Python 多核并行计算的示例代码
Nov 07 Python
python xlsxwriter库生成图表的应用示例
Mar 16 Python
python实现按长宽比缩放图片
Jun 07 Python
基于pip install django失败时的解决方法
Jun 12 Python
解决pycharm工程启动卡住没反应的问题
Jan 19 Python
python操作excel让工作自动化
Aug 09 Python
tensorflow求导和梯度计算实例
Jan 23 Python
python退出循环的方法
Jun 18 Python
Tensorflow与Keras自适应使用显存方式
Jun 22 Python
利用Python过滤相似文本的简单方法示例
Feb 03 Python
Python基础知识学习之类的继承
May 31 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
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
探讨php中遍历二维数组的几种方法详解
2013/06/08 PHP
php的dl函数用法实例
2014/11/06 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
2019/10/17 PHP
js静态作用域的功能。
2006/12/25 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
聊一聊JS中this的指向问题
2016/06/17 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
python中list循环语句用法实例
2014/11/10 Python
Unicode和Python的中文处理
2017/03/19 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
python二进制读写及特殊码同步实现详解
2019/10/11 Python
python中必要的名词解释
2019/11/20 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
python map比for循环快在哪
2020/09/21 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
公司财务流程之主管工作流程
2014/03/03 职场文书
设计大赛策划方案
2014/06/13 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
承兑汇票延期证明
2015/06/23 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
Oracle锁表解决方法的详细记录
2022/06/05 Oracle