利用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中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
浅析python递归函数和河内塔问题
Apr 18 Python
Python实现学校管理系统
Jan 11 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
python 将json数据提取转化为txt的方法
Oct 26 Python
python自定义函数实现一个数的三次方计算方法
Jan 20 Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 Python
python deque模块简单使用代码实例
Mar 12 Python
Python实现画图软件功能方法详解
Jul 28 Python
python判断变量是否为列表的方法
Sep 17 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Jun 11 Python
Python下opencv库的安装过程及问题汇总
Jun 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
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
Lazy Load 延迟加载图片的jQuery插件中文使用文档
2012/10/18 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
javascript实现数字倒计时特效
2016/03/30 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
JS中多层次排序算法的实现代码
2021/01/06 Javascript
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
详解Python当中的字符串和编码
2015/04/25 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
彻底搞懂Python字符编码
2018/01/23 Python
python调用自定义函数的实例操作
2019/06/26 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
.net面试题
2015/12/22 面试题
优秀工会工作者事迹材料
2014/06/02 职场文书
党委书记个人对照检查材料
2014/09/15 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript