2

特定のモジュールからのインポートに問題がありますが、一般的なモジュールからのインポートには問題があります。私のプロジェクト構造:

project-folder
  aaa-folder
    __init__.py
    a.py
  bbb-folder
    __init__.py
    b.py
  ccc-folder
    __init__.py
    c.py

すべてのinit .py ファイルは空白です。プロジェクト フォルダーは、私の sys.path にあります。

モジュール b:

from aaa.a import a_method
from ccc.c import c_method

def b_method(): print 'bye'
print 'hi'

モジュール c:

from aaa.a import a_method
from bbb.b import b_method

def c_method(): print 'bye'
print 'hi'

モジュール a:

from bbb.b import b_method
from ccc.c import c_method

def a_method(): print 'bye'
print 'hi'

Python シェルからすべてのメソッドをインポートできます。モジュール b と c はどちらもコマンド ラインから実行され、単純に「hi」を返します。モジュール a を実行すると、ImportError: No module named b が表示されます

問題の手がかりはどこにありますか?

4

1 に答える 1

2

コメントで何度か述べたように、循環インポートを使用するようにプロジェクトを設計しています。

両方のモジュールが「 import 」形式のインポートを使用する場合、循環インポートは問題ありません。2 番目のモジュールが最初のモジュール (「モジュール インポート名から」) から名前を取得しようとしていて、インポートが最上位にある場合、それらは失敗します。これは、最初のモジュールが 2 番目のモジュールのインポートでビジーであるため、1 番目の名前がまだ利用できないためです。

これらの各モジュールの一番上に print ステートメントを配置すると、何が起こっているかがわかります...

例 a、b、c: print "inside aaa" # bbb, ccc

module を実行するaと、次のようになります。

$ python aaa/a.py 
inside aaa
inside bbb
inside aaa
Traceback (most recent call last):
  File "aaa/a.py", line 2, in <module>
    from bbb.b import b_method
  File "/Users/user/Desktop/project/bbb/b.py", line 2, in <module>
    from aaa.a import a_method
  File "/Users/user/Desktop/project/aaa/a.py", line 2, in <module>
    from bbb.b import b_method
ImportError: cannot import name b_method

a.pyimport に行きますがb.py、がb必要なaので、そのモジュールに戻り、残りのbbbインポートを確認します。まあb、この時点では部分的にしかロードされてb_methodいないので、まだ定義されていません。だからあなたはクラッシュします。

あなたがすべきことは、あなたのモジュールが相互にインポートするのを避けることです。他のすべてが共有機能をインポートする共通モジュールのセットが必要です。しかし、python faq に記載されているように、モジュールの名前空間 ( import bbb) をインポートするだけで回避できます。

于 2012-11-26T00:06:27.877 に答える