PyDevに3つのプロジェクトを設定しましたが、それらはすべてプロジェクト参照リストに相互に含まれています。説明のために:
proj_f
pack_foo
mod_fooa (contains class Fooa)
mod_foob (contains class Foob)
mod_faa (contains class Faa)
pack_fii
mod_fiia (contains class Fiia)
mod_fiib (contains class Fiib)
proj_b
mod_bar (contains function func_bar)
pack_baz
mod_baza (contains class Baza)
mod_bazb (contains class Bazb)
proj_t
tester (what I'm running from)
例として、テスターは次のようにします。
from pack_foo.mod_fooa import Fooa
from pack_fii.mod_fiia import Fiia
from mod_bar import func_bar
func_bar(Fooa(), Fiia())
およびmod_bar:
from pack_foo.mod_fooa import Fooa
from pack_fii.mod_fiia import Fiia
def func_bar(fooa, fiia):
if not fooa:
fooa = Fooa()
if not fiia:
fiia = Fiia()
fooa.do_magic()
fiia.do_magic()
私が見ているのは、fooからのインポートの一部はImportError: cannot import name
、テスターから呼び出すとmod_barに取り込まれることです(重要なのは、すべてではありませんが一部です)。mod_barだけを実行すると、インポートは正常に機能します。依存関係を削除してmod_barからインポートし、テスターから実行すると、正常に機能します。クラスのサブセットがfinからbとtの両方にインポートされ、tから実行された場合にのみ壊れます。インポートがどのように機能するかについてのドキュメントを読み、解決策を探し回ってみましたが、正しい方向を示しているものは何も見つかりませんでした。これはPython内部のあいまいな部分と関係があると感じていますが、それが何であるかを知るには十分な知識がありません。
tester
これは何が起こっているかを正確に表していると思いますが、からの参照mod_bar
が間接的であるという複雑さの層が追加されています(これは、実際にはレタスですがtester
、コードを操作するときにコードを操作するために使用するファイルですmod_bar
地形ファイル、およびレタスはtester
呼び出している他のいくつかのモジュールによってロードされています。)誰かがこの問題を乗り越える方法に関する情報を探し始めるための少なくともいくつかの場所を私に提供できますか?
編集:
私はこれをもう少し、特にスタックトレースを見ていました:
Traceback (most recent call last):
File "C:\Python27\Lib\site-packages\lettuce\__init__.py", line 53, in <module>
terrain = fs.FileSystem._import("terrain")
File "C:\Python27\Lib\site-packages\lettuce\fs.py", line 74, in _import
module = imp.load_module(name, fp, pathname, description)
File "C:\Users\adminsetup\workspace\nytd_lettuce_lib\terrain.py", line 6, in <module>
from session.session import Session
ImportError: cannot import name Session
私terrain = fs.FileSystem._import("terrain")
にlettuce.__init__()
これらの頭痛の種を与えている循環輸入を引き起こしている可能性がありますか?