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 相关文章推荐
Windows系统配置python脚本开机启动的3种方法分享
Mar 10 Python
python连接mysql实例分享
Oct 09 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
python email smtplib模块发送邮件代码实例
Apr 26 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
Python常见排序操作示例【字典、列表、指定元素等】
Aug 15 Python
python实现录音小程序
Oct 26 Python
python实现推箱子游戏
Mar 25 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
使用python os模块复制文件到指定文件夹的方法
Aug 22 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
Python-jenkins模块获取jobs的执行状态操作
May 12 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递归删除目录几个代码实例
2014/04/21 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
js、css、img等浏览器缓存问题的2种解决方案
2013/10/23 Javascript
jQuery .tmpl() 用法示例介绍
2014/08/21 Javascript
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
python基础教程之五种数据类型详解
2017/01/12 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
应届毕业生应聘自荐信
2013/12/07 职场文书
中等生评语大全
2014/05/04 职场文书
优秀党支部书记事迹材料
2014/05/29 职场文书
培训研修方案
2014/06/06 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
工程资料员岗位职责
2015/04/13 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android