2015-05-02 142 views
0

我想要做的是创建两个字段的字典(UUID的路径)和Ubuntu的命令行填补他们输出Python的字典创建类型错误

from subprocess import Popen, PIPE 

Devices = [] 


def UUID(): 
    blkid = Popen(['sudo', 'blkid'], stdout=PIPE) 
    sed = Popen(['sed', 's/^.*UUID="/UUID="/'], stdin=blkid.stdout, stdout=PIPE) 
    cut = Popen(['cut', '-d', '"', '-f', '2'], stdin=sed.stdout, stdout=PIPE) 
    end_of_pipe = cut.stdout 
    Devices = [{'uuid': uuid, 'path': None} for uuid in end_of_pipe] 
    return Devices 


def Path(Devices): 
    blkid = Popen(['sudo', 'blkid'], stdout=PIPE) 
    cut = Popen(['cut', '-d', ':', '-f', '1'], stdin=blkid.stdout, stdout=PIPE) 
    end_of_pipe = cut.stdout 
    for path in end_of_pipe: 
     Devices['path'] = path 
    return Devices 

Devices = UUID() 
Path(Devices) 
print Devices 

返回错误:

Traceback (most recent call last): 
    File "2.py", line 24, in <module> 
    Path(Devices) 
    File "2.py", line 20, in Path 
    Devices['path'] = path 
TypeError: list indices must be integers, not str 
+0

什么让你对这个错误感到困惑?设备是一个列表,你不能用字符串索引列表。 –

回答

1

Devicesdictlist对象,而不是dict对象本身。您必须先确定要访问的索引,然后访问该对象的path键。一个例子是:

Device[0]['path'] = 'some/path' 

在你的情况,如果end_of_pipe相同的顺序持有路径,Devices你可以这样做:

for path, device in zip(end_of_pipe, Devices): 
    device['path'] = path 
0

Python是能够分析文本。您不需要使用外部工具,如sed剪切来做到这一点。

import re 
from subprocess import Popen, Pipe 

pattern = re.compile(r'^(?P<path>[^:]+).*UUID="(?P<uuid>[^"]+)') 
devices = [] 
blkid = Popen(['sudo', 'blkid'], stdout=PIPE) 
for line in f: 
    match_object = re.match(pattern, line) 
    if match_object: 
     devices.append(match_object.groupdict()) 

在这一点上,设备将包含字典的列表,每个字典包含两个键:路径UUID。此解决方案还有另一个优点:您只需拨打blkid一次。