Проверьте, находится ли объект в списке, заданном pyshark

Я пытаюсь прочитать файл pcap с помощью pyshark. Кажется, pyshark создает список объектов, где каждый объект имеет информацию о каждом слое внутри пакетов.

Я хочу только оценить, существует ли слой в пакете. Может, кто-то может мне помочь.

Список объектов «слои» выглядит так:

[<ETH Layer>, <IP Layer>, <SCTP Layer>, <DATA Layer>] 

Но эта оценка терпит неудачу, поскольку внутри списка есть объекты, а не строки.

 if <ETH Layer> in layers: print "Yes, Ethernet layer exists" if '<ETH Layer>' in layers: print "Yes, Ethernet layer exists" 

Ниже приведены мои тесты …

 Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> >>> import pyshark >>> file = pyshark.FileCapture('C:\\files\\input.pcap') >>> packet=file[0] >>> layers=packet.layers >>> layers [<ETH Layer>, <IP Layer>, <SCTP Layer>, <DATA Layer>, <SCTP Layer>, <DATA Layer>] >>> if packet.eth in layers: print "Yes, Ethernet layer exists" ... Yes, Ethernet layer exists >>> Yes, Ethernet layer exists >>> if '<ETH Layer>' in layers: print "Yes, Ethernet layer exists" ... >>> 

Эта оценка дает правильный результат

 if packet.eth in layers: print "Yes, Ethernet layer exists" 

Эти 2 сбой, так как оценивают значение False

 if <ETH Layer> in layers: print "Yes, Ethernet layer exists" if '<ETH Layer>' in layers: print "Yes, Ethernet layer exists" 

*Обновить:

Если я тестирую package.ip, пакет.eth, пакет.sctp работает только в том случае, если существует слой ip, eth или sctp, если какой-либо слой не существует (т. Е. Tcp), я получаю ошибку ниже.

 >>> if packet.tcp in layers: print "Yes, Ethernet layer exists" ... Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\site-packages\pyshark\packet\packet.py", line 110, in __getattr__ raise AttributeError() AttributeError 

благодаря

<ETH Layer> не является фактическим объектом, это именно то, что __repr__ метод __repr__ объекта. Ваш Python REPL вызывает это, чтобы увидеть, как распечатать представление оцененного выражения. Точно так же он может вызвать __str__ если вы попросите его print выражение. Сравните эти:

 >> packet.layers[0] <ETH Layer> >> print packet.layers[0] Layer ETH: Destination: 52:54:00:12:37:02 (52:54:00:12:37:02) .... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default) Address: 52:54:00:12:37:02 (52:54:00:12:37:02) .... ...0 .... .... .... .... = IG bit: Individual address (unicast) Type: IP (0x0800) Source: 08:00:28:1d:ae:8b (08:00:28:1d:ae:8b) .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default) Address: 08:00:28:1d:ae:8b (08:00:28:1d:ae:8b) .... ...0 .... .... .... .... = IG bit: Individual address (unicast) 

Но для функционального ответа на ваш вопрос я считаю, что если вы хотите увидеть, существует ли слой в вашем пакете, вы можете сделать что-то вроде:

 if 'eth' in packet: # ...