2013-02-18 48 views
1

我正在创建一个Python脚本来收集基础硬件上的数据cat /proc/cpuinfo 我试图提取我需要的信息。但我有问题。这里是脚本无法使用python从Linux shell命令提取信息

import os 
p=os.popen ("cat /proc/cpuinfo") 
string=[] 
i=0 
for line in p.readlines(): 
    string.append(line.split(":")) 
    if(string[i][0]=='model name'): 
     fout = open("information.txt", "w") 
     fout.write("processor:") 
     fout.write(string[i][1]) 
     fout.close() 
    i+=1 

我的程序不会进入如果循环在所有原因?在此先感谢帮助

回答

0

很难说什么是错的。我无法一目了然,但在我的Ubuntu 12.10上,它也以相同的方式失败。无论如何,使用subprocess模块,因为popen已弃用。

subprocess.check_output(['cat', '/proc/cpuinfo'])返回一个字符串相当成功,至少在我的系统上。 subprocess.check_output(['cat', '/proc/cpuinfo']).split('\n')会给你一个你可能会遍历的列表。请注意0​​将不起作用。在将该行分割为':'之后有一些标签。不要忘记调用strip()string[i][0].strip()=='model name'

然后,关于Python 2.6+(甚至2.5+,虽然2.5需要from __future__ import with_statement)它几乎总是使用with用于处理文件的好习惯,你需要打开:

with open("information.txt", "w") as fout: 
    fout.write("processor:") 
    fout.write(string[i][1]) 

最后,那些说你可能只是打开一个文件并阅读它的文章,是非常正确的。这是最好的解决方案:

with open('/proc/cpuinfo') as f: 
    #Here you may read the file directly. 
+0

感谢得到它的工作.. – Rakesh 2013-02-18 05:47:28

2

根本没有必要在这里使用cat。重构它是这样的:

with open("/proc/cpuinfo") as f: 
    for line in f: 
    # potato potato ... 
+0

+1/proc/cpuinfo是一个文件。 – 2013-02-18 05:49:00

1

它可能会进入循环,但可能会有“模型名称”周围的空白。您可以拨打.strip()将其删除。如果你不需要完整列表string

for line in p.readlines(): 
    line=line.split(":") 
    if(line[0]=='model name\t') : 
      #Do work 

您可以打开/proc/cpuinfo作为一个文件:

with open("/proc/cpuinfo") as file: 
    for line in file: 
     key, sep, value = line.partition(":") 
     if sep and key.strip() == "model name": 
      with open("information.txt", "w") as outfile: 
       outfile.write("processor:" + value.strip()) 
      break