0

pysharkパケットをライブでキャプチャ するために使用しようとしています。

からパケットを取得しようとしmultiprocessing.Queueたり、それらをun-pickleしようとすると、次のエラーが発生します。

python2.7/site-packages/pyshark/packet/layer.py"、48 行目、__
getattr__ val = self.get_field_value(item, raw=self.raw_mode)
(... 複数回 ...)
RuntimeError : 最大再帰Python object` の呼び出し中に深さを超えました。

オブジェクトがキューから取得されたか、ピクル解除されたかにかかわらず、オブジェクトを再構築するときに問題があると思われます。
驚いたことに、これを で実行してもエラーは発生しませんQueue.Queue

この問題を再現するために使用されるコードは次のとおりです。

import pyshark
import multiprocessing
import Queue
import cPickle as pickle

# Capture on eth0
interface = pyshark.LiveCapture(interface="eth0")

def queue_test(queue):
    """ Puts captured packets in a queue, then un-queue them and display """
    for packet in interface.sniff_continuously(packet_count=5):
        queue.put(packet)
    while not queue.empty():
        packet = queue.get()
        print "Packet {} {}".format(packet.highest_layer,packet._packet_string)

def pickle_test():
    """ Immediately pickle and unpickle the packet to display it"""
    for packet in interface.sniff_continuously(packet_count=5):
        pickled_packet = pickle.loads(pickle.dumps(packet, pickle.HIGHEST_PROTOCOL))
        print "Packet #{}, {} {}".format(pickled_packet.highest_layer,pickled_packet._packet_string)


if __name__ == "__main__":
    normal_queue = Queue.Queue()
    process_queue = multiprocessing.Queue()

    # Runs fine
    queue_test(normal_queue)

    # Both crash with a RuntimeError
    queue_test(process_queue)
    pickle_test()

RuntimeErrors が発生するのはなぜですか? また、どうすればよいですか?
私は何か間違ったことをしていpysharkますか、それともこれを行うのに問題がありますか?

4

1 に答える 1

0

ここではあまり成功しなかったので、pysharkの Githubに問題を投稿しましたが、ライブラリに何かが欠けていました。

これは、パケットが使用する一部のクラスが getattr をオーバーライドするために発生します。541fc52で修正済み

この問題のリンク: https://github.com/KimiNewt/pyshark/issues/63

于 2015-03-02T07:46:31.910 に答える