利用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程序在两台电脑之间传输消息的方法
Mar 13 Python
详解Python验证码识别
Jan 25 Python
对TensorFlow的assign赋值用法详解
Jul 30 Python
Python实现拷贝/删除文件夹的方法详解
Aug 29 Python
用python生成1000个txt文件的方法
Oct 25 Python
python标记语句块使用方法总结
Aug 05 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
基于python实现微信好友数据分析(简单)
Feb 16 Python
pycharm如何实现跨目录调用文件
Feb 28 Python
Python实现动态给类和对象添加属性和方法操作示例
Feb 29 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
Nov 28 Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 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 实现explort() 功能的详解
2013/06/20 PHP
php根据分类合并数组的方法实例详解
2013/11/06 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
javascript 打印内容方法小结
2009/11/04 Javascript
javascript常见操作汇总
2014/09/03 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
深入理解js promise chain
2016/05/05 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
微信小程序多列表渲染数据开关互不影响的实现
2020/06/05 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
Python获取某一天是星期几的方法示例
2017/01/17 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
canvas实现有递增动画的环形进度条的实现方法
2019/07/10 HTML / CSS
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
学生党员思想汇报
2013/12/28 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
健康状况证明模板
2014/10/23 职场文书
小学英语教学反思范文
2016/02/15 职场文书
Python自然语言处理之切分算法详解
2021/04/25 Python
golang连接MySQl使用sqlx库
2022/04/14 Golang
带你了解Java中的ForkJoin
2022/04/28 Java/Android
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL