首页 > 解决方案 > 模块 PyShark 没有属性“PipeCapture”

问题描述

众所周知,pyshark 是 tshark 的包装器。大流量时,由于缓冲区大小的限制,部分数据包会丢失(tshark 默认有 2 MB)

我的想法如下:我想以 20MB 的缓冲区大小运行 tshark,并将输出通过管道传输到我的 Python 脚本。在这种情况下,我使用 PipeCapture 而不是 LiveCapture,如下所示:

import pyshark
import pandas as pd
import os

r, w = os.pipe()
pid = os.fork()
r = os.fdopen(r)    

capture = pyshark.PipeCapture(pipe=r, bpf_filter='udp port 5060')

for packet in capture.sniff_continuously():
  print(packet)

我得到了错误:

AttributeError: module 'pyshark' has no attribute 'PipeCapture' . 

我在这里检查了 pyshark 的源代码: https ://github.com/KimiNewt/pyshark/blob/master/src/pyshark/capture/pipe_capture.py

怎么了?

更新:

正如@maxkanthauer 推荐的那样:import pyshark import pandas as pd import sys from pyshark.capture.pipe_capture import PipeCapture

r =  sys.stdin

while True:
    capture = PipeCapture(pipe=r)
    print(capture)

并启动我的脚本:

tcpdump -l  port 5060 -i etho  | python  pyshark_test.py

虽然我确定有很多数据包输出是:

<PipeCapture (0 packets)>
<PipeCapture (0 packets)>
<PipeCapture (0 packets)>

标签: pythontsharkpyshark

解决方案


由于某些原因,PipeCapture 不是直接在 pyshark 下,而是在 pyshark.capture.pipe_capture 下。此外, os.pipe() 不是 pipe 参数的有效值。以下应该有效:

import pyshark
import sys
from pyshark.capture.pipe_capture import PipeCapture

r = sys.stdin

capture = PipeCapture(pipe=r)

def print_callback(pkt):
    print(pkt)

capture.apply_on_packets(print_callback)

推荐阅读