2015-01-15 4 views
0

Я форматирую поток данных в словаре и затем пытаюсь распечатать его в более удобном для чтения формате.AttributeError: объект 'list' не имеет атрибута 'dlc'

Однако при попытке запустить функцию/метод printMsg я получаю сообщение об ошибке, которое для жизни я не могу понять. Пожалуйста, смотрите ниже код

#!/usr/bin/python 

#Imported Modules/Libraries 

import re, os, subprocess 
from time import sleep, clock 
from collections import defaultdict 
from multiprocessing import Process, Queue 
import pprint 
from os import system 

#Global Declarations 
last_time = 0.0 
myDict = {} 
count = defaultdict(int) 
queueVar = Queue() 

class PCANmsg(object): 
    def __manline__(self): 

     can_ID   = 0 
     self.DLC  = 0 
     self.CANtime = 0 
     self.PCANperiod = 0 
     self.Count  = 0 
     self.hdata0  = 0 
     self.hdata1  = 0 
     self.hdata2  = 0 
     self.hdata3  = 0 
     self.hdata4  = 0 
     self.hdata5  = 0 
     self.hdata6  = 0 
     self.hdata7  = 0 
     self.timing  = 0 

def fillDict(lines): 
    global myDict 
    global last_time 
    global count 

    x = PCANmsg() 

    for line in lines: 
     start = clock() 
     if(line[0].isdigit()): 
      splitline = line.strip().split() 

      del splitline[1:4] 
      can_ID   = splitline[1] 
      x.DLC   = splitline[2] 
      x.CANtime  = splitline[0] 
      x.PCANperiod  = 0 
      x.Count   = count[can_ID] + 1 
      x.hdata0   = splitline[3] 
      x.hdata1   = splitline[4] 
      x.hdata2   = splitline[5] 
      x.hdata3   = splitline[6] 
      x.hdata4   = splitline[7] 
      x.hdata5   = splitline[8] 
      x.hdata6   = splitline[9] 
      x.hdata7   = splitline[10] 
      end = clock() 
      x.timing   = (end - start) * 1000 

      myDict[can_ID] = [x.DLC, 
           x.hdata0, 
           x.hdata1, 
           x.hdata2, 
           x.hdata3, 
           x.hdata4, 
           x.hdata5, 
           x.hdata6, 
           x.hdata7, 
           x.timing, 
           x.Count, 
           x.PCANperiod] 

      start = end 
      printMsg(myDict, can_ID) 


def printMsg(_dict,_id): 

    print('%06X: %3d %8.2f %8.2F %02X %02X %02X %02X %02X %02X %02X %02X %d' % 
      (_id, 
      _dict[_id].DLC, 
      _dict[_id].CANtime, 
      _dict[_id].PCANperiod, 
      _dict[_id].int(count), 
      _dict[_id].hdata0, 
      _dict[_id].hdata1, 
      _dict[_id].hdata2, 
      _dict[_id].hdata3, 
      _dict[_id].hdata4, 
      _dict[_id].hdata5, 
      _dict[_id].hdata6, 
      _dict[_id].hdata7, 
      _dict[_id].ELAPSED)) 

if __name__ == "__main__": 

    system("echo \"i 0x011c e\" >/dev/pcan33")  

    procRX = subprocess.Popen('receivetest -f=/dev/pcan33'.split(), stdout=subprocess.PIPE) 
    lines = iter(procRX.stdout.readline,"") 

    fillDict(lines) 

Когда код выполняется он прекрасно работает на untul вызов функции printMsg (mydict, _id):

Traceback (most recent call last): 
    File "./manline.py", line 107, in <module> 
    fillDict(lines) 
    File "./manline.py", line 79, in fillDict 
    printMsg(myDict, can_ID) 
    File "./manline.py", line 86, in printMsg 
    _dict[_id].DLC, 
AttributeError: 'list' object has no attribute 'DLC' 

Может кто-нибудь посоветовать, что является причиной этого. Моя цель для этого также состоит в том, чтобы иметь возможность запускать fillDict и printMsg параллельно, как только я получу печать.

ответ

0

Этот кусок кода ваш

myDict[can_ID] = [x.DLC, 
          x.hdata0, 
          x.hdata1, 
          x.hdata2, 
          x.hdata3, 
          x.hdata4, 
          x.hdata5, 
          x.hdata6, 
          x.hdata7, 
          x.timing, 
          x.Count, 
          x.PCANperiod] 

Это экономит запись против ID в виде списка. Где в качестве вашего кода здесь

def printMsg(_dict,_id): 

    print('%06X: %3d %8.2f %8.2F %02X %02X %02X %02X %02X %02X %02X %02X %d' % 
     (_id, 
     _dict[_id].DLC, 
     _dict[_id].CANtime, 
     _dict[_id].PCANperiod, 
     _dict[_id].int(count), 
     _dict[_id].hdata0, 
     _dict[_id].hdata1, 
     _dict[_id].hdata2, 
     _dict[_id].hdata3, 
     _dict[_id].hdata4, 
     _dict[_id].hdata5, 
     _dict[_id].hdata6, 
     _dict[_id].hdata7, 
     _dict[_id].ELAPSED)) 

ожидает, что это словарь.

Это должно быть что-то вроде

myDict[can_ID] = {} 
myDict[can_ID]["DLC"]= bla bla 
myDict[can_ID]["hdata0"] = bla bla 
... 
... 
#So on so forth 

Затем вы можете продолжить печать так, как вы делаете прямо сейчас. Или вы можете распечатать вот так

for key, val in _dict[_id].iteritems(): 
    print key, value 
Смежные вопросы