232

私は2つのPythonモジュールを持っています:

a.py

import b

def hello():
  print "hello"

print "a.py"
print hello()
print b.hi()

b.py

import a

def hi():
  print "hi"

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

AttributeError: 'module' object has no attribute 'hi'

エラーはどういう意味ですか?どうすれば修正できますか?

4

18 に答える 18

228

相互のトップレベルのインポートがありますが、これはほとんどの場合悪い考えです。

Python で相互インポートがどうしても必要な場合は、関数内でインポートする方法があります。

# In b.py:
def cause_a_to_do_something():
    import a
    a.do_something()

これで a.py はimport b問題なく安全に実行できます。

(一見すると、毎回呼び出すcause_a_to_do_something()ので非常に非効率に見えるかもしれませんが、実際にはインポート作業は初回のみです。2 回目以降のモジュールのインポートは、迅速な操作です。 import)

于 2009-08-08T23:27:29.100 に答える
111

標準の Python モジュールの 1 つと同じ名前のモジュールに誤って名前を付けた場合にも、このエラーが発生しました。たとえばcommands、Python ライブラリ モジュールでもあるというモジュールがありました。これは、私のローカル開発環境では正しく機能したが、Google App Engine で実行すると特定のエラーで失敗したため、追跡が困難であることが判明しました。

于 2010-06-26T14:18:21.073 に答える
48

問題は、モジュール間の循環依存です。aインポートbおよびbインポートa。ただし、そのうちの1つを最初にロードする必要があります。この場合、Pythonはa前にbモジュールを初期化b.hi()することになり、でアクセスしようとするとまだ存在していませんa

于 2009-08-08T23:19:41.020 に答える
26

間違った方法でインポートされた列挙型を参照すると、このエラーが発生しました。

from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member

正しいインポート:

from package.MyEnumClass import MyEnumClass

誰かを助けることを願っています

于 2015-04-16T23:32:08.977 に答える
6

モジュールが実際にインポートされていないため、このエラーが発生しました。コードは次のようになります。

import a.b, a.c

# ...

something(a.b)
something(a.c)
something(a.d)  # My addition, which failed.

最後の行はAttributeError. a原因は、 (a.ba.c) のサブモジュールが明示的にインポートされていることに気付きませんでしimporta

于 2016-06-24T20:26:45.973 に答える
5

古いバージョンのリポジトリを git からチェックアウトしたときに、この問題に遭遇しました。Git は私の.pyファイルを置き換えましたが、追跡されていないファイルを残しました.pyc.pyファイルと.pycファイルが同期していないため、ファイル内のコマンドimport.pyファイル内の対応するモジュールを見つけることができませんでした.pyc

解決策は、単に.pycファイルを削除し、それらを自動的に再生成することでした。

于 2018-09-21T02:43:49.797 に答える
4

上記のすべての回答は素晴らしいですが、ここでチャイムを鳴らしたいと思います。上記の問題が見つからない場合は、作業環境を整理してみてください。それは私のために働いた。

于 2018-06-06T18:21:29.347 に答える
4

ubuntu 18.04 ( virtualenvpython.3.6.x ) では、次のリロードスニペットで問題が解決しました。

main.py

import my_module  # my_module.py
from importlib import reload # reload 
reload(my_module)

print(my_module)
print(my_modeule.hello())

どこ:

|--main.py    
|--my_module.py

詳細については、ドキュメントを確認してください:こちら

于 2019-08-10T12:51:52.530 に答える
0

2 つのプリントを追加することで、何が起こっているかを理解できます。

a.py :

print(__name__)
import b

b.py :

print(__name__)
import a

それで:

$ python3 a.py
__main__
b
a

そのため、a.py2回ロード/実行されることになります。1つと1__main__a

于 2021-10-16T07:41:33.957 に答える
-1

インポートの順序が問題を抱えていた理由でした:

a.py:

############
# this is a problem
# move this to below
#############
from b import NewThing

class ProblemThing(object):
    pass

class A(object):
   ###############
   # add it here
   # from b import NewThing
   ###############
   nt = NewThing()
   pass

b.py:

from a import ProblemThing

class NewThing(ProblemThing):
    pass

RichieHindieの回答に似ていますが、クラスを使用した別の例です。

于 2019-11-25T20:01:37.213 に答える
-2

私の場合、python 2.7 で numpy バ​​ージョン 1.15.0 を使用している場合、

pip install statsmodels=="0.10.0"
于 2020-06-23T16:47:13.150 に答える