利用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 相关文章推荐
Python中利用sqrt()方法进行平方根计算的教程
May 15 Python
Python2.7简单连接与操作MySQL的方法
Apr 27 Python
用python结合jieba和wordcloud实现词云效果
Sep 05 Python
python中logging库的使用总结
Oct 18 Python
Python标准库inspect的具体使用方法
Dec 06 Python
Python读取Json字典写入Excel表格的方法
Jan 03 Python
python实现堆和索引堆的代码示例
Mar 19 Python
详解python异步编程之asyncio(百万并发)
Jul 07 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
给Django Admin添加验证码和多次登录尝试限制的实现
Jul 26 Python
pytorch显存一直变大的解决方案
Apr 08 Python
Django实现翻页的示例代码
May 24 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
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
php图片添加水印例子
2016/07/20 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
JavaScript插入动态样式实现代码
2012/02/22 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
jQuery 操作input中radio的技巧
2016/07/18 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
p5.js码绘“跳动的小正方形”的实现代码
2019/10/22 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
JS+DIV实现拖动效果
2020/02/11 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
python实现从web抓取文档的方法
2014/09/26 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Python中文件操作简明介绍
2015/04/13 Python
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
Django实现的自定义访问日志模块示例
2017/06/23 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Python中Unittest框架的具体使用
2019/08/27 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
Python decimal模块使用方法详解
2020/06/08 Python
计算机专业自我鉴定
2013/10/15 职场文书
平面设计师的工作职责
2013/11/21 职场文书
老龄工作先进事迹
2014/08/15 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
2015最新民情日记范文
2015/06/26 职场文书
oracle索引总结
2021/09/25 Oracle