2012-04-30 12 views
0

私は3つのプロジェクトをPyDevに設定しており、それらはすべてプロジェクト参照リストにお互いを持っています。例示の目的のために:レタスを使った円形地雷の埋め込み

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から依存関係とインポートを削除してテスターから実行すると、正常に動作します。クラスのサブセットがf inからbとtの両方にインポートされ、tがtから実行される場合にのみ壊れます。私は、インポートの仕組みやソリューションについてのグーグルについてドキュメントを読んでみましたが、正しい方向に私を指摘しているものは見つかりませんでした。私はこれがPython内部のいくつかの不明瞭な部分と関係があると感じていますが、それが何であるかを知るのに十分なものではありません。

私は、これは正確にmod_bartesterからの参照が間接的であることを伴う複雑さの追加層は、(私は仕事として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 

lettuce.__init__()terrain = fs.FileSystem._import("terrain")は私にこれらの頭痛を与えている円形の輸入を引き起こしていませんか?

答えて

0

はい、私は循環インポートを取得していました。問題は、import lettuceを実行するとlettuce.pyが実行され、terrainが動的にインポートされるということです。私と一緒に起こっていた

は、私は今度の輸入にLoggerManagerがworldにキューにログメッセージをプッシュlogging.Handlerサブクラスが含まれているため、logger_managerアクセス​​worldimport lettuceを行いAbstractSessionをインポートセッションクラスを持っているということでした。セッションオブジェクトを回転させることですべてのテストを開始したいので、テレインでセッションをインポートすることを意味する@beforeeachメソッドをテレインでセッションごとに開始する必要があります。

もちろん、どこのファイルでもセッションをインポートするたびに、session.session.Sessionは時間によって初期化されないイベントチェーン全体(セッション> AbstractSession> lettuce> terrain> Session)をトリガーします。地形はそれを読み込もうとします。

私は最高の解決策は、地形の世界に関連付けられているログハンドラとログキャッシュを張って、地形にハンドラをアタッチすることです。幸いにも、ロギングはグローバルアクセスであるため、これは私のオプションです。これは実際には、レタスについて語るコアライブラリにコードがないため、私のフレームワークのコンパートメント化を幾分改善しています。レタスはすべて、レタスのlibにあります。それでも、レタスにはこれらの地雷が組み込まれていないのがベストだろう...

tl; dr、実際に基本的なテストスイート以上のことをしたい場合はレタスを避けてください。

関連する問題