2014-01-27 4 views
0

Я пытаюсь отбросить некоторые приближения.Python: Ошибка атрибута (объект NoneType не имеет атрибута split)

Приведенная ниже функция выбрасывает ошибку атрибута. Что может быть проблемой? Пожалуйста, помогите мне, если это возможно.

def calculate_tps(filename,identity): 
    ##command='tshark -r %s -R -T pdml diameter' 
    first_time = None 
    last_time=None 
    tshark='tshark -r %s -R \'(diameter.Destination-Host==%s)&& (diameter.CC-Request-Type==3)\' -T pdml'% (filename,identity) 
    time = None 
    req = 0 
    for line in os.popen(tshark, 'r'): 
    m=pattern.search(line)  
    if m: 
     #print m.group(1) 
     if m.group(1) == 'timestamp': 
    time=m.group(2) 
    if not first_time: 
     first_time=time 
     elif m.group(1) == 'diameter.Session-Id': 
     req +=1 
    if(req % 100) ==0: 
     print 'processed 1000 requests req number %s ' % req 

    # making some approximations discard ms 
    first = long(first_time.split('.').pop(0)) 
    last = long(time.split('.').pop(0)) 
    time_elapsed = first -last 
    print "%s requests in %s seconds, tps = %s " % (req, time_elapsed, req/time_elapsed) 

Вот полный код. Я пытаюсь вычислить количество запросов в секунду, используя tshark.

#!/usr/bin/python 
import re 
import sys 
import commands 

    import os 
    import time 


    pattern = re.compile('<field name="(timestamp|diameter.Session-Id)".*value="([^"]+)') 


    from optparse import OptionParser 
    def parse_options(): 
     parser = OptionParser() 
    # parser.add_option("-f", "--file", dest="filename", 
    #     help="input pcap file", metavar="FILE") 
     parser.add_option("-i", "--identity", dest="identity", 
         help="diameter identity to filter on", metavar="IDENTITY") 

     opts, args = parser.parse_args() 
     return opts, args 

    def calculate_tps(filename,identity): 
     ##command='tshark -r %s -R -T pdml diameter' 
     first_time = None 
     last_time=None 
     tshark='tshark -r %s -R \'(diameter.Destination-Host==%s)&& (diameter.CC-Request-Type==3)\' -T pdml'% (filename,identity) 
     time = None 
     req = 0 
     for line in os.popen(tshark, 'r'): 
     m=pattern.search(line)  
     if m: 
      #print m.group(1) 
      if m.group(1) == 'timestamp': 
     time=m.group(2) 
     print 'time is %s' % time 
     if not first_time: 
      first_time=time 
      prin 
      elif m.group(1) == 'diameter.Session-Id': 
      req +=1 
     if(req % 100) ==0: 
      print 'processed 1000 requests req number %s ' % req 

     # making some approximations discard ms 
     first = long(first_time.split('.').pop(0)) 
     last = long(time.split('.').pop(0)) 
     time_elapsed = first -last 
     print "%s requests in %s seconds, tps = %s " % (req, time_elapsed, 
     req/time_elapsed)  

    def main(): 
     global options 
     options, args = parse_options() 
     if len(args) < 1: 
     print >>sys.stderr, "missing pcap file.Please specify the pcap" 
     sys.exit(1) 
     #print options.identity 



     start_time = time.time() 
     calculate_tps(args.pop(0), options.identity) 
     end_time = time.time() 
     print 'completed in %s', (end_time - start_time) 

    if __name__ == '__main__': 
     main() 
+0

Это означает, что ваши значения в 'first_time' или' time' не являются строками, поэтому у них нет метода '.split'. –

+0

Возможно, вы, вероятно, никогда не открываете файл должным образом, поэтому вы никогда не заходите в цикл for и не перенаправляете время на что-то полезное. Таким образом, инициализированное значение None используется и терпит неудачу. –

+0

у вас серьезные проблемы с отступом с опубликованным кодом. также было бы неплохо, если бы вы предоставили содержимое «pattern», а также трассировку. – micromoses

ответ

1

Когда вы делаете звонки здесь:

first = long(first_time.split('.').pop(0)) 
last = long(time.split('.').pop(0)) 

Вы предположили, что каждый из них является строкой. Похоже, что они не были переназначены во время цикла над содержимым файла, что говорит о том, что ваши матчи не выполняются. Вы можете обернуть те в условной проверки с чем-то вроде этого:

if None in (first_time, time): 
    print "Uh oh, one of first_time or time is None - ", first_time, time 

Это даст вам показатель проблемы, по крайней мере.

0

Это потому, что ваши первые и последние не являются строками. Таким образом, нет разделения атрибутов типа. Итак, если вам нужен атрибут split, вы можете изменить его на тип строки.

Смежные вопросы