利用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使用循环实现批量创建文件夹示例
Mar 25 Python
Python实例一个类背后发生了什么
Feb 09 Python
python 把数据 json格式输出的实例代码
Oct 31 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
Mar 15 Python
解决已经安装requests,却依然提示No module named requests问题
May 18 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
Python实现分段线性插值
Dec 17 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 Python
pandas数据筛选和csv操作的实现方法
Jul 02 Python
Python socket服务常用操作代码实例
Jun 22 Python
python爬取youtube视频的示例代码
Mar 03 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
PHP中的float类型使用说明
2010/07/27 PHP
php 团购折扣计算公式
2011/11/24 PHP
redis 队列操作的例子(php)
2012/04/12 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
2017年最新PHP经典面试题目汇总(上篇)
2017/03/17 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
最佳的addEvent事件绑定是怎样诞生的
2011/10/24 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
JS三级联动代码格式实例详解
2019/12/30 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
python文本数据相似度的度量
2018/03/12 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
python面试题之列表声明实例分析
2019/07/08 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
python多进程使用函数封装实例
2020/05/02 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
实习教师个人的自我评价
2013/11/08 职场文书
毕业生求职的求职信
2013/12/05 职场文书
教师对学生的评语
2014/04/28 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
无犯罪记录证明
2014/09/19 职场文书
批评与自我批评总结
2014/10/17 职场文书
班委竞选稿范文
2015/11/21 职场文书
导游词之任弼时故居
2020/01/07 职场文书
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript
关于Redis的主从复制及哨兵问题
2022/06/16 Redis