利用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中通过threading模块定义和调用线程的方法
Jul 12 Python
Python搭建HTTP服务器和FTP服务器
Mar 09 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
简单学习Python多进程Multiprocessing
Aug 29 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
实例讲解Python3中abs()函数
Feb 19 Python
详解Python用户登录接口的方法
Apr 17 Python
python打包成so文件过程解析
Sep 28 Python
Python 3.8 新功能大揭秘【新手必学】
Feb 05 Python
Python  word实现读取及导出代码解析
Jul 09 Python
python 简单的调用有道翻译
Nov 25 Python
python实现马丁策略的实例详解
Jan 15 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
require(),include(),require_once()和include_once()的异同
2007/01/02 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
详解AngularJS中的表单验证(推荐)
2016/11/17 Javascript
微信小程序中使用Promise进行异步流程处理的实例详解
2017/08/17 Javascript
JS设计模式之命令模式概念与用法分析
2018/02/06 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
[04:00]黄浦江畔,再会英雄——完美世界DOTA2 TI9应援视频
2019/07/31 DOTA
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
python递归全排列实现方法
2018/08/18 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
python将数组n等分的实例
2019/12/02 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
关于递归的一道.NET面试题
2013/05/12 面试题
土木工程专业大学毕业生求职信
2013/10/13 职场文书
领导失职检讨书
2014/02/24 职场文书
劳资协议书范本
2014/04/23 职场文书
婚前保证书
2014/04/29 职场文书
宣传普通话标语
2014/06/27 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL
python中的getter与setter你了解吗
2022/03/24 Python
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技