Python 在使用 Scapy 创建空 pcap 文件时抑制警告

Python supress warnings while creating a empty pcap file with Scapy

我想创建一个空的 pcap 文件。我正在使用 'Scapy' 的 wrpcap 模块。但是 wrpcap 恰好采用 2 arguments:一个是 file name,另一个是 packet list,例如:

wrpcap("my.pcap",my_pkt_list)

因为我想创建一个空的并且我没有数据包列表,所以我正在向 pcap 文件写入一个空字符串。这是在创建文件,但也会给出警告和错误,因为字符串与数据包类型不匹配。

WARNING: PcapWriter: unknown LL type for str. Using type 1 (Ethernet)
Traceback (most recent call last):
  File "test.py", line 35, in <module>
    wrpcap("pcap/FU.pcap","")
  File "/usr/lib/python2.7/site-packages/scapy/utils.py", line 466, in wrpcap
    PcapWriter(filename, *args, **kargs).write(pkt)
  File "/usr/lib/python2.7/site-packages/scapy/utils.py", line 646, in write
    self._write_packet(pkt)
  File "/usr/lib/python2.7/site-packages/scapy/utils.py", line 688, in _write_packet
    sec = int(packet.time)
AttributeError: 'str' object has no attribute 'time'

目前,我可以使用 try and except 抑制错误,但无法抑制警告。

代码

from scapy.all import *
try:
    wrpcap("my.pcap","")
except:
    pass

警告仍然存在:

WARNING: PcapWriter: unknown LL type for str. Using type 1 (Ethernet)

如何从 python 代码中抑制它?

文本 "WARNING: ..." 不是异常的一部分,因此不会被您的 try 子句压制。

我的一个想法是在调用期间重定向标准输出

from scapy.all import *
try:
    old_stdout = sys.stdout
    sys.stdout = None
    wrpcap("my.pcap","")
    sys.stdout = old_stdout
except:
    pass

应该抑制调用期间的所有输出

Python 在标准库中有一个用于抑制警告的内置方法:

import warnings
warnings.simplefilter("ignore", Warning)

您可以阅读有关警告库的更多信息 in the docs

编辑

看起来 scapy 没有使用 warnings 库来生成它。相反,它 logs them to a logger 调用了 scapy.runtime,级别为 warning。显然有一些默认的日志记录配置可以将其回显到 stdout。您可以为 scapy.runtime 添加自己的日志处理程序来抑制它们。

您可以使用 scapy 的 PcapWriter 方法来避免该警告。

from scapy.all import *
try:
    writer=PcapWriter("my.pcap")
except:
    pass

这将创建您的空 pcap 文件。当你想向它写入一些数据包时,只需使用以下代码:

writer.write(<Your_packets>)
writer.flush()