属性エラー:「モジュール」オブジェクトには属性がありません

StackOverflow https://stackoverflow.com/questions/1250103

  •  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 輸入 bb 輸入 a. 。しかし、そのうちの1つを最初にロードする必要があります - この場合、Pythonはモジュールを初期化することになります abb.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.ba.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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top