属性エラー:「モジュール」オブジェクトには属性がありません
-
12-09-2019 - |
質問
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'
エラーはどういう意味ですか?どうすれば修正できますか?
解決
相互のトップレベルのインポートがありますが、これはほとんど常に悪い考えです。
Pythonで相互輸入が必要な場合は、機能内でインポートする方法です。
# In b.py:
def cause_a_to_do_something():
import a
a.do_something()
今、A.pyは安全に行うことができます import b
問題を引き起こすことなく。
(一見すると、それが見えるかもしれません cause_a_to_do_something()
それが行うので、非常に非効率的です import
あなたがそれを呼ぶたびに、しかし実際には輸入作業は初めて行われます。 2回目以降の時間は、モジュールをインポートすると、迅速な操作です。)
他のヒント
また、標準のPythonモジュールの1つと同じ名前を持つモジュールを不注意に命名すると、このエラーも見ました。たとえば、モジュールが呼ばれていました commands
これはPythonライブラリモジュールでもあります。これは、私のローカル開発環境で正しく機能したため、追跡するのが難しいことが判明しましたが、Google App Engineで実行すると指定されたエラーが失敗しました。
問題は、モジュール間の循環依存性です。 a
輸入 b
と b
輸入 a
. 。しかし、そのうちの1つを最初にロードする必要があります - この場合、Pythonはモジュールを初期化することになります a
前 b
と b.hi()
あなたがそれにアクセスしようとするとき、まだ存在しません a
.
間違った方法でインポートされた列挙を参照することにより、このエラーが発生しました。
from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member
正しいインポート:
from package.MyEnumClass import MyEnumClass
それが誰かを助けることを願っています
モジュールが実際にインポートされていないため、このエラーが発生しました。コードは次のように見えました:
import a.b, a.c
# ...
something(a.b)
something(a.c)
something(a.d) # My addition, which failed.
最後の行はになりました AttributeError
. 。原因は、私がのサブモジュールが a
(a.b
と a.c
) そうだった 明示的に 輸入され、それを想定しました import
実際にインポートされたステートメント a
.
上記の回答はすべて素晴らしいですが、ここでチャイムしたいと思います。上記の問題を見つけなかった場合は、作業環境をクリアしてみてください。それは私のために働いた。
Gitのリポジトリの古いバージョンをチェックアウトしたとき、私はこの問題に遭遇しました。 gitが私のものに取って代わりました .py
ファイルですが、追跡されていません .pyc
ファイル。以来 .py
ファイルと .pyc
ファイルは同期していませんでした import
のコマンド .py
ファイルは、対応するモジュールを見つけることができませんでした .pyc
ファイル。
解決策は、単に削除することでした .pyc
ファイル、およびそれらを自動的に再生します。
私は同じ問題に直面しました。使用して修正 reload
.
import the_module_name
from importlib import reload
reload(the_module_name)
方法はわかりませんが、以下の変更は私の問題をソートしました:
Emoji.pyとしてファイル名を持っていて、emojiをインポートしようとしていた例えば、ファイルとインポート名の名前を持っていました。しかし、ファイルの名前を変更すると問題が解決しました。
それが役立つように願っています
Circular imports cause problems, but Python has ways to mitigate it built-in.
The problem is when you run python a.py
, it runs a.py
but not mark it imported as a module. So in turn a.py
-> imports module b -> imports module a -> imports module b. The last import a no-op since b is currently being imported and Python guards against that. And b is an empty module for now. So when it executes b.hi()
, it can't find anything.
Note that the b.hi()
that got executed is during a.py
-> module b -> module a, not in a.py
directly.
In your specific example, you can just run python -c 'import a'
at top-level, so the first execution of a.py
is registered as importing a module.
@MD5 Same for me, Try changing the module name or import the function directly
on ubuntu 18.04 ( virtualenv, python.3.6.x), the following reload snippet solved the problem for me:
main.py
import my_module # my_modyle.py
from importlib import reload # reload
reload(my_module)
print(my_module)
print(my_modeule.hello())
where:
|--main.py
|--my_module.py
for more documentation check : here