0

Python で Kaitai Struct を使用して pcap を読み込もうとしています。

ファイルからpythonファイルを作成しましpcap.ksy

$ ./bin/kaitai-struct-compiler -t python  --outdir xx formats/network/pcap.ksy 
$ ls xx
ethernet_frame.py  ipv6_packet.py  __pycache__
icmp_packet.py     packet_ppi.py   tcp_segment.py
ipv4_packet.py     pcap.py         udp_datagram.py

PYTHONPATH は xx ディレクトリに設定されます。ここで、単純な 1 行のスクリプトを実行して、モジュールをロードできることを確認すると

from pcap import Pcap

このエラーが発生します

$ python3 try.py 
Traceback (most recent call last):
  File "try.py", line 1, in <module>
    from pcap import Pcap
  File "/spare/tmp/scratch/kaitai-struct-compiler-0.8/xx/pcap.py", line 11, in <module>
    from packet_ppi import PacketPpi
  File "/spare/tmp/scratch/kaitai-struct-compiler-0.8/xx/packet_ppi.py", line 11, in <module>
    from ethernet_frame import EthernetFrame
  File "/spare/tmp/scratch/kaitai-struct-compiler-0.8/xx/ethernet_frame.py", line 11, in <module>
    from ipv6_packet import Ipv6Packet
  File "/spare/tmp/scratch/kaitai-struct-compiler-0.8/xx/ipv6_packet.py", line 12, in <module>
    from ipv4_packet import Ipv4Packet
  File "/spare/tmp/scratch/kaitai-struct-compiler-0.8/xx/ipv4_packet.py", line 13, in <module>
    from ipv6_packet import Ipv6Packet
ImportError: cannot import name 'Ipv6Packet'

それを読んだところ、pythonパスは問題なく、pythonモジュールはpacpからイーサネット、ipv6、ipv4までのチェーンをたどっています。次に、ipv4 が ipv6 を再度ロードしようとすると、スクリプトが失敗します。

コードがインポート ループをトリガーしていると思います。

私が間違っていることを知っている人はいますか?

4

1 に答える 1