利用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中操作列表之list.extend()方法的使用
May 20 Python
Python操作串口的方法
Jun 17 Python
Python根据区号生成手机号码的方法
Jul 08 Python
Python实现的最近最少使用算法
Jul 10 Python
Django中ORM表的创建和增删改查方法示例
Nov 15 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
详解python中的Turtle函数库
Nov 19 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
PyQt+socket实现远程操作服务器的方法示例
Aug 22 Python
Python hashlib模块加密过程解析
Nov 05 Python
python用TensorFlow做图像识别的实现
Apr 21 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安全配置 如何配置使其更安全
2011/12/16 PHP
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
php计算一个文件大小的方法
2015/03/30 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
js密码强度校验
2015/11/10 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
2019/07/26 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
使用 Element UI Table 的 slot-scope方法
2019/10/10 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
[02:48]DOTA2英雄基础教程 暗夜魔王
2013/12/12 DOTA
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
Python后台开发Django会话控制的实现
2019/04/15 Python
Python 分发包中添加额外文件的方法
2019/08/16 Python
python多线程扫描端口(线程池)
2019/09/04 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
详解python的xlwings库读写excel操作总结
2021/02/26 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
境外导游求职信
2014/02/27 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
护士节慰问信
2015/02/15 职场文书