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 を再度ロードしようとすると、スクリプトが失敗します。
コードがインポート ループをトリガーしていると思います。
私が間違っていることを知っている人はいますか?