きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

wsadminでImportError レアもの?

すごい面倒臭いエラーに出くわした。


ImportErrorがなかなか取り除けなかった。
凡ミスもあった。
__init__.pyをミペルミスしてて、
__ini__.pyになってた。
これはいい。


今回ドハマりしたのは、もっと気づきにくい話。


ImportErrorなんだから、探索パスを気にした。
sys.pathを出力。
あるある、ちゃんとある。
でも見つからない。
__init__.pyは修正済み。



wsadmin.shを叩くときには、-javaoption "-Dwsadmin.script.libraries.packages=/どこそこ:/あそこ:/こっち" -f わたしの.py を渡している。
それがsys.pathにも反映されている。


実際のフォルダは、こんなかんじ。
a/b/c.py
a/b/d/e.py
a/f/g.py


wsadmin.shに-fで渡してるのがc.pyな感じ。
e.pyはg.pyに書いてるクラスをインポートしている。
from a.f.g import Hoge, Foo


どんなに頑張っても、eモジュールが見つからない。
e.pyの例のimportは、これから先に使うつもりで、まだ使っていなくて、消してみたら、e.pyが見つかるようになった。


なんじゃそりゃ!!

もっかい構成を詳細に書いておく。
c.pyがg.pyにあるクラスをインスタンス化して、e.pyにある関数をg.pyのクラスのインスタンスに関数のまま渡して、c.pyがインスタンスをキックすると、最終的に関数が呼ばれる構成。
言葉で書くと分かりにくい。。。


真の原因は自分には分からないが、
クラスをインポートしてるモジュールは、見つからなくなる、って解釈になる。ざっくりすぎだが、症状としてはそうなる。
python的なパスと、Java的なパスがごちゃごちゃしたのか??


こんなことで半日潰れた。
解決の糸口を見つけただけ良かったと思おう。
まだ終わってない。自分が考えた設計の障害になっている。きっと乗り越えてやるよ。