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 相关文章推荐
pyqt和pyside开发图形化界面
Jan 22 Python
深入解析Python中的lambda表达式的用法
Aug 28 Python
Python实现列表转换成字典数据结构的方法
Mar 11 Python
python实现人脸识别代码
Nov 08 Python
Zookeeper接口kazoo实例解析
Jan 22 Python
对numpy中shape的深入理解
Jun 15 Python
python图像处理入门(一)
Apr 04 Python
Python爬虫爬取Bilibili弹幕过程解析
Oct 10 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
python多进程使用函数封装实例
May 02 Python
Python通过format函数格式化显示值
Oct 17 Python
python获得命令行输入的参数的两种方式
Nov 02 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
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
PHP培训要多少钱
2017/06/06 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
javascript自定义事件功能与用法实例分析
2017/11/08 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python模块之StringIO使用示例
2015/04/08 Python
python简单实现旋转图片的方法
2015/05/30 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
python手写均值滤波
2020/02/19 Python
Python 多进程、多线程效率对比
2020/11/19 Python
通息工程毕业生自荐信
2013/10/16 职场文书
临床医学专业毕业生的自我评价
2013/10/17 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
借名购房协议书范本
2014/10/06 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
乱世佳人观后感
2015/06/08 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python