利用Python获取操作系统信息实例


Posted in Python onSeptember 02, 2016

前言

每一位运维人员都应该对自己所管理的机器配置很清楚,因为这对我们快速处理问题很有帮助,比如随着业务增长,突然某些机器负载上涨的厉害,这时候要排查原因,除了从应用程序、架构上分析外,当前硬件性能的分析应该是必不可少的一环,今天我们将不用第三方模块,用python自带模块和系统提供的运行信息来获取我们需要的信息,这个脚本除了硬件外,还抓取了当前系统进程数和网卡流量功能,所以这个版本实现的功能基本对应了之前psutil实现的内容,多的不说了,直接贴代码:

#!/usr/bin/env python
 
from collections import OrderedDict
from collections import namedtuple
import os
import glob
import re
 
def cpuinfo():
 
 cpuinfo=OrderedDict()
 procinfo=OrderedDict()
 
 nprocs = 0
 with open('/proc/cpuinfo') as f:
 for line in f:
  if not line.strip():
  
  cpuinfo['proc%s' % nprocs] = procinfo
  nprocs=nprocs+1
  
  procinfo=OrderedDict()
  else:
  if len(line.split(':')) == 2:
   procinfo[line.split(':')[0].strip()] = line.split(':')[1].strip()
  else:
   procinfo[line.split(':')[0].strip()] = ''
  
 return cpuinfo
 
def meminfo():
 
 meminfo=OrderedDict()
 
 with open('/proc/meminfo') as f:
 for line in f:
  meminfo[line.split(':')[0]] = line.split(':')[1].strip()
 return meminfo
 
 
def netdevs():
 
 with open('/proc/net/dev') as f:
 net_dump = f.readlines()
 
 device_data={}
 data = namedtuple('data',['rx','tx'])
 for line in net_dump[2:]:
 line = line.split(':')
 if line[0].strip() != 'lo':
  device_data[line[0].strip()] = data(float(line[1].split()[0])/(1024.0*1024.0), 
      float(line[1].split()[8])/(1024.0*1024.0))
 
 return device_data
 
def process_list():
 
 pids = []
 for subdir in os.listdir('/proc'):
 if subdir.isdigit():
  pids.append(subdir)
 
 return pids
 
 
dev_pattern = ['sd.*','xv*']
 
def size(device):
 nr_sectors = open(device+'/size').read().rstrip('\n')
 sect_size = open(device+'/queue/hw_sector_size').read().rstrip('\n')
 
 return (float(nr_sectors)*float(sect_size))/(1024.0*1024.0*1024.0)
 
def detect_devs():
 for device in glob.glob('/sys/block/*'):
 for pattern in dev_pattern:
  if re.compile(pattern).match(os.path.basename(device)):
  print('Device:: {0}, Size:: {1} GiB'.format(device, size(device)))
 
 
if __name__=='__main__':
 cpuinfo = cpuinfo()
 for processor in cpuinfo.keys():
 print(cpuinfo[processor]['model name'])
 
 meminfo = meminfo()
 print('Total memory: {0}'.format(meminfo['MemTotal']))
 print('Free memory: {0}'.format(meminfo['MemFree']))
 
 netdevs = netdevs()
 for dev in netdevs.keys():
 print('{0}: {1} MiB {2} MiB'.format(dev, netdevs[dev].rx, netdevs[dev].tx))
 
 
 pids = process_list()
 print('Total number of running processes:: {0}'.format(len(pids)))
 
 
 detect_devs()

以下是脚本的解释部分:

1、OrderedDict,这个功能是可以生成有序字典,大家都知道在python中字典是无序的,当然你也可以根据kye来排序,但用OrderedDict就可以直接生成有序字典,有序字典的顺序只跟你添加的顺序有关。

2、namedtuple,功能是可以给元组的索引起个名字,一般我们访问元组,只能用索引去访问,但如果给索引定义了名字,你就可以用定义的这个名字去访问了,为方便大家理解,我们举个栗子:

>>> from collections import namedtuple
>>> data = namedtuple('data',['rx','tx'])
>>> d = data(123,456)
>>> print d
data(rx=123, tx=456)
>>> print d.rx
123

3、glob,在这行for device in glob.glob(‘/sys/block/*')用到了这个功能,它主要方法就是glob,它返回所有匹配的文件列表。

4、re.compile(pattern).match(os.path.basename(device)),这句是将正则表达式编译为Pattern对象,然后使用Pattern匹配文本,获得匹配结果,匹配成功返回真,无法匹配时将返回None。

总结

以上就是利用python获取操作系统信息的全部内容,利用python来获取还是很方便实用,希望这篇文章对大家的学习和工作能有一定的帮助。

Python 相关文章推荐
pygame学习笔记(5):游戏精灵
Apr 15 Python
Python遍历文件夹和读写文件的实现代码
Aug 28 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 Python
PyCharm在win10的64位系统安装实例
Nov 26 Python
python和flask中返回JSON数据的方法
Mar 26 Python
django 在原有表格添加或删除字段的实例
May 27 Python
关于python2 csv写入空白行的问题
Jun 22 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
Jun 28 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 #Python
Linux下为不同版本python安装第三方库
Aug 31 #Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
Aug 30 #Python
分享Python开发中要注意的十个小贴士
Aug 30 #Python
Python将图片批量从png格式转换至WebP格式
Aug 22 #Python
利用Python批量生成任意尺寸的图片
Aug 29 #Python
Python自定义类的数组排序实现代码
Aug 28 #Python
You might like
教你如何把一篇文章按要求分段
2006/10/09 PHP
php生成excel列序号代码实例
2013/12/24 PHP
PHP 类与构造函数解析
2017/02/06 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
lib.utf.js
2007/08/21 Javascript
JS之小练习代码
2008/10/12 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
2014/09/03 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
2015/08/26 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
js实现的在线调色板功能完整实例
2016/12/21 Javascript
原生js实现验证码功能
2017/03/16 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
原生js检测页面加载完毕的实例
2018/09/11 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
EasyUI 数据表格datagrid列自适应内容宽度的实现
2019/07/18 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
浅谈Python爬取网页的编码处理
2016/11/04 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
详解python算法常用技巧与内置库
2020/10/17 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
如何利用cmp命令比较文件
2013/09/23 面试题
2014年社区植树节活动方案
2014/02/28 职场文书
二年级小学生评语
2014/04/21 职场文书
五四演讲稿范文
2014/09/03 职场文书
搬迁通知
2015/04/20 职场文书
2015年度保密工作总结
2015/04/24 职场文书
劳动仲裁代理词范文
2015/05/25 职场文书
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL