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
ますか、それともこれを行うのに問題がありますか?