0

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__()これらの頭痛の種を与えている循環輸入を引き起こしている可能性がありますか?

4

1 に答える 1

0

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

私に起こっていたのは、AbstractSession をインポートする Session クラスがあり、logging.Handlerログ メッセージを のキューにプッシュするサブクラスを含む LoggerManager をインポートするworldため、logger_manager がimport lettuceにアクセスすることですworld。また、Session オブジェクトをスピンアップしてすべてのテストを開始したかったので、@beforeeach各テストの前にセッションを開始する方法を地形に用意しました。これは、地形にセッションをインポートすることを意味しました。

もちろん、これは、どこかのファイルにセッションをインポートするたびに、一連のイベント (セッション>抽象セッション>レタス>地形>セッション) がトリガーされ、地形が読み込まれるまでに session.session.Session が初期化されないままになることを意味します。それをアップします。

私の最善の解決策は、世界に関連付けられているログ ハンドラーとログ キャッシュをテレインに貼り付けてから、テレインにハンドラー自体をアタッチさせることだと思います。幸いなことに、ロギングはグローバル アクセスであるため、これは私にとってのオプションです。レタスについて話すコアライブラリにはコードがなく、レタスライブラリではすべてオフになるため、これは実際に私のフレームワークの区画化をいくらか改善します。それでも、これらの地雷が組み込まれていないレタスは最高だろう...

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

于 2012-04-30T21:26:04.827 に答える