澳门新葡萄京官网首页 1

前言

  1、glob模块

    glob模块是最简单的模块之一,内容非常少。用它可以查找符合特定规则的文件路径名。跟使用windows下的文件搜索差不多。查找文件只用到三个匹配符:”*”,
“?”, “[]”。”*”匹配0个或多个字符;”?”匹配单个字符;

  ”[]”匹配指定范围内的字符,如:[0-9]匹配数字。

    glob.glob

    返回所有匹配的文件路径列表。它只有一个参数pathname,定义了文件路径匹配规则,这里可以是绝对路径,也可以是相对路径。下面是使用glob.glob的例子:

     例子1:

    澳门新葡萄京官网首页 2

    结果:

    澳门新葡萄京官网首页 3

    例子2

    澳门新葡萄京官网首页 4

    结果:

    澳门新葡萄京官网首页 5

    如果你想得到每个文件的绝对路径,你可以在返回值上调用realpath()函数:

    澳门新葡萄京官网首页 6

    结果:

    澳门新葡萄京官网首页 7

    

Python
作为一种功能强大且通用的编程语言而广受好评,它具有非常清晰的语法特点,适用于科学计算生态,在数据分析、交互、可视化等方面。

每一位运维人员都应该对自己所管理的机器配置很清楚,因为这对我们快速处理问题很有帮助,比如随着业务增长,突然某些机器负载上涨的厉害,这时候要排查原因,除了从应用程序、架构上分析外,当前硬件性能的分析应该是必不可少的一环,今天我们将不用第三方模块,用python自带模块和系统提供的运行信息来获取我们需要的信息,这个脚本除了硬件外,还抓取了当前系统进程数和网卡流量功能,所以这个版本实现的功能基本对应了之前psutil实现的内容,多的不说了,直接贴代码:

    glob.glob

      获取一个可编历对象,使用它可以逐个获取匹配的文件路径名。与glob.glob()的区别是:glob.glob同时获取所有的匹配路径,而glob.iglob一次只获取一个匹配路径。

    这有点类似于.NET中操作数据库用到的DataSet与DataReader。下面是一个简单的例子:

    澳门新葡萄京官网首页 8

    结果:

    澳门新葡萄京官网首页 9

 

不久前,夏威夷大学的化学研究人员发现,用于化学数据计算分析的一组
Python
脚本编程有误,该脚本的不同计算机操作系统中运行会产生不同的结果。在计算分析蓝藻实验的结果时,研究人员 Philip
Williams 等人发现,通过
Python 脚本跑出来的实验结果,因操作系统而异。这导致这些研究人员对已发表的
150 多项化学研究论文结果产生了怀疑。

#!/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()

   2、生成唯一ID

澳门新葡萄京官网首页 ,    

      在有些情况下你需要生成一个唯一的字符串。我看到很多人使用md5()函数来达到此目的,但它确实不是以此为目的。其实有一个名为uuid()的Python函数是用于这个目的的。

    澳门新葡萄京官网首页 10

    澳门新葡萄京官网首页 11

 

这份脚本名为“Willoughby-Hoye”,脚本大约有 1000 行,它自 2014
年开始使用,用来计算核磁共振图谱的化学位移值。研究人员发现在 macOS Mavericks
和 Windows
10 运行的结果是相同的(173.2),也在研究人员的预想中,但在 macOS
Mojave 和 Ubuntu 上却不相同(分别为 172.4 和
172.7),几个结果看起来差不多,但在科学研究领域,对精度要求很高,看似接近的数字起止相差很大。

以下是脚本的解释部分:

  3、序列化json

    澳门新葡萄京官网首页 12

    澳门新葡萄京官网首页 13

 

澳门新葡萄京官网首页 14

1、OrderedDict,这个功能是可以生成有序字典,大家都知道在python中字典是无序的,当然你也可以根据kye来排序,但用OrderedDict就可以直接生成有序字典,有序字典的顺序只跟你添加的顺序有关。

  4、压缩字符

    当谈起压缩时我们通常想到文件,比如ZIP结构。在Python中可以压缩长字符,不涉及任何档案文件。

    

import zlib

string = """   Lorem ipsum dolor sit amet, consectetur
                adipiscing elit. Nunc ut elit id mi ultricies
                adipiscing. Nulla facilisi. Praesent pulvinar,
                sapien vel feugiat vestibulum, nulla dui pretium orci,
                non ultricies elit lacus quis ante. Lorem ipsum dolor
                sit amet, consectetur adipiscing elit. Aliquam
                pretium ullamcorper urna quis iaculis. Etiam ac massa
                sed turpis tempor luctus. Curabitur sed nibh eu elit
                mollis congue. Praesent ipsum diam, consectetur vitae
                ornare a, aliquam a nunc. In id magna pellentesque
                tellus posuere adipiscing. Sed non mi metus, at lacinia
                augue. Sed magna nisi, ornare in mollis in, mollis
                sed nunc. Etiam at justo in leo congue mollis.
                Nullam in neque eget metus hendrerit scelerisque
                eu non enim. Ut malesuada lacus eu nulla bibendum
                id euismod urna sodales. """

print "Original Size: {0}".format(len(string))

compressed = zlib.compress(string)
print "Compressed Size: {0}".format(len(compressed))

decompressed = zlib.decompress(compressed)
print "Decompressed Size: {0}".format(len(decompressed))

那么为什么出现这类结果呢?

2、namedtuple,功能是可以给元组的索引起个名字,一般我们访问元组,只能用索引去访问,但如果给索引定义了名字,你就可以用定义的这个名字去访问了,为方便大家理解,我们举个栗子:

   5、OrderedDict

    python中的字典是无序的,因为它是按照hash来存储的,但是python中有个模块collections(英文,收集、集合),里面自带了一个子类OrderedDict,实现了对字典对象中元素的排序。请看下面的实例:

    普通字典,顺序不同,内容相同却是一个字典

dict1= {'z':3 ,'y':2, 'x':1}
dict2= {'z':3 , 'x':1,'y':2}

print dict1 == dict2
print dict1
print dict2

 

  输出:

    澳门新葡萄京官网首页 15

dict1 = OrderedDict()
dict1['z'] = 3
dict1['y'] = 2
dict1['x'] = 1

dict2 = OrderedDict()
dict2['z'] = 3
dict2['x'] = 1
dict2['y'] = 2

print dict1 == dict2
print dict1
print dict2

    输出:

      澳门新葡萄京官网首页 16

    再看几个例子

dict1 = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

kd = OrderedDict(sorted(dict1.items(), key=lambda t: t[0]))
print kd
#按照value排序
vd = OrderedDict(sorted(dict1.items(),key=lambda t:t[1]))
print vd

#输出
# OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
# OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

 

 

这份脚本出现的 bug,与我们印象中的 bug 很不同,bug
通常在任何地方都会有相同错误结果,而不只是在某些特定的环境中。经过检查,问题锁定在数据的检索方式,每次运行的数据都存储在两个文件中,文件按文件名成对检索,并成对处理。关键在于,检索文件的顺序因操作系统而异。只要文件匹配,就能得到正确的结果。如果不是,将处理来自两次不同运行的数据。

>>> from collections import namedtuple
>>> data = namedtuple('data',['rx','tx'])
>>> d = data(123,456)
>>> print d
data(rx=123, tx=456)
>>> print d.rx
123

  6、sorted函数

    python内置的排序函数sorted可以对list或者iterator进行排序,官网文档见:,该函数原型为:

sorted(iterable[, cmp[, key[, reverse]]])

    参数解释:

    1、iterable指定要排序的list或者iterable,不用多说;

    2、cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数,如:

       students为类对象的list,没个成员有三个域,用sorted进行比较时可以自己定cmp函数,例如这里要通过比较第三个数据成员来排序,代码可以这样写:

      students = [(‘john’, ‘A’, 15), (‘jane’, ‘B’, 12), (‘dave’,
‘B’, 10)]

      sorted(students, key=lambda student : student[2])

    3、key为函数,指定取待排序元素的哪一项进行排序,函数用上面的例子来说明,代码如下:

           sorted(students, key=lambda student : student[2]) 

      key指定的lambda函数功能是去元素student的第三个域(即:student[2]),因此sorted排序时,会以students所有元素的第三个域来进行排序。

      有了上面的operator.itemgetter函数,也可以用该函数来实现,例如要通过student的第三个域排序,可以这么写:

      sorted(students, key=operator.itemgetter(2)) 

 

      sorted函数也可以进行多级排序,例如要根据第二个域和第三个域进行排序,可以这么写:

      sorted(students, key=operator.itemgetter(1,2))
 即先跟句第二个域排序,再根据第三个域排序。

    4、reverse参数就不用多说了,是一个bool变量,表示升序还是降序排列,默认为false(升序排列),定义为True时将按降序排列。

 

 

此前,许多新闻报道中认为罪魁祸首是 Python
标准库模块 glob 模块,该脚本使用 Python 的 glob
模块来查找符合特定格式的文件路径名——基于 glob
的结果去生成读取文件列表。但是 glob
的结果又取决于操作系统的文件返回值。于是脚本的计算结果会受到文件处理顺序的影响。在
Python 文档中关于 glob 模块的描述如下:

3、glob,在这行for device in glob.glob(‘/sys/block/*')用到了这个功能,它主要方法就是glob,它返回所有匹配的文件列表。

glob 模块根据 Unix shell
使用的规则查找与指定模式匹配的所有文件路径名,最终结果以任意顺序返回。

4、re.compile(pattern).match(os.path.basename(device)),这句是将正则表达式编译为Pattern对象,然后使用Pattern匹配文本,获得匹配结果,匹配成功返回真,无法匹配时将返回None。

所以这并不是 bug, glob 的结果是任意顺序返回的,它并没有按照指定的顺序返回结果。这错不在
Python,而在于编写这份
Python 脚本的人。该脚本的作者应该在代码中定义期望的排序行为,以确保一致性。如果是一个好的程序员,在详细阅读文档后,他们能够注意到文档中的说明(例如 glob 的返回结果是任意的),从而在编写代码时考虑到它。这个事情也告诉我们,好的编程技巧相当重要,尤其是当应用到科学计算这类严谨的研究中,失之毫厘,必然差之千里。

总结

Williams 等人发现了这个问题后,为该代码添加了必要的排序代码。他希望科学家们更加关注实验的计算部分,至于该脚本问题影响到其他论文研究结果有多少,他也难以得出定论。

以上就是利用python获取操作系统信息的全部内容,利用python来获取还是很方便实用,希望这篇文章对大家的学习和工作能有一定的帮助。

一般来说,代码并不是一篇学术论文中最被关注的点。所以说,计算机学界及其他领域学界往往不会对代码质量过分深究。这也导致,不管是学术研究者还是业界人士,都能感觉到「学术原型代码」和「工业级别代码」之间的巨大差异。

您可能感兴趣的文章:

  • python
    urllib中的编码处理示例
  • Python中解析JSON并同时进行自定义编码处理实例
  • Python如何获取系统iops示例代码
  • python3编码问题汇总
  • 用Python实现命令行闹钟脚本实例
  • Python爬虫爬取美剧网站的实现代码
  • Python选课系统开发程序
  • 简单谈谈Python中函数的可变参数
  • Python实现自动添加脚本头信息的示例代码
  • 好用的Python编辑器WingIDE的使用经验总结
  • Linux下为不同版本python安装第三方库
  • Python
    编码处理-str与Unicode的区别

不过相比于工业界的代码,学术论文中代码 bug 的影响毕竟还是有限的。

参考: