AttributeError: 'module' object has no attribute


193

私は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'

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


あなたの質問はこの回答と非常に似ていることに注意してください。どうやらこの答えのコードは見つけるだけで機能しますが、あなたのコードはそうではありませんか?stackoverflow.com/a/7336880/565879
Buttons840

回答:


188

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

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を呼び出すたびに実行されるため、非常に非効率的であるように見えるかもしれませんが、実際には、インポート作業は初めて実行されるだけです。 )


92

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


42

問題は、モジュール間の循環依存です。a輸入bb輸入a。しかし、そのうちの一つは、最初にロードする必要がある-この場合はPythonの終了モジュールを初期化するまでabb.hi()あなたがそれにアクセスしようとする存在はまだありませんa


21

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

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

正しいインポート:

from package.MyEnumClass import MyEnumClass

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


7

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

import a.b, a.c

# ...

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

最後の行はAttributeError。原因は、aa.ba.c)のサブモジュールが明示的にインポートされたことに気付かず、importステートメントが実際にインポートされたと想定していたことaです。


6

私は同じ問題に直面しました。を使用して修正reload

import the_module_name
from importlib import reload
reload(the_module_name)

おかげで、これは私のために働いた唯一の答えです:)
TheTechRobo36414519

5

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

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


あなたはすべて削除するには、このコマンドを使用することができます.pycファイル:find . -name "*.pyc" -exec rm -f {} \;
Ollie第

4

のUbuntu 18.04virtualenvのpython.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

より多くのドキュメントチェックのために:ここに


3

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


0

方法はわかりませんが、以下の変更により問題が分類されました。

たとえば、ファイル名がemoji.pyで、絵文字をインポートしようとしていたので、ファイル名とインポート名は同じでした。しかし、ファイルの名前を変更することで問題は解決しました。

それが役に立てば幸い


0

循環インポートは問題を引き起こしますが、Pythonには組み込みを軽減する方法があります。

問題は、を実行すると実行されますがpython a.pya.pyインポートされたものをモジュールとしてマークしていません。したがって、順番にa.py->インポートモジュールb->インポートモジュールa->インポートモジュールb。bが現在インポートされているため、最後のインポートは何もしないので、Pythonはそれを防ぎます。そしてbは今のところ空のモジュールです。だからそれが実行されるときb.hi()しても何も見つかりません。

b.hi()実行されたはa.pya.py直接ではなく->モジュールb->モジュールaの間にあることに注意してください。

特定の例では、python -c 'import a'トップレベルで実行できるため、の最初の実行はa.pyモジュールのインポートとして登録されます。


0

オーダーインポートが問題が発生した理由です。

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の回答に似ていますが、クラスが含まれている、外観のもう1つの例です。


0

私は何度もこの問題に取り組みましたが、それについて深く掘り下げることはしませんでした。今、私は主要な問題を理解しています。

今回の問題は、次のようなさまざまなモジュールからシリアライザ(djangoとrestframework)をインポートすることでした。

from rest_framework import serializers

from common import serializers as srlz
from prices import models as mdlpri

# the line below was the problem 'srlzprod'
from products import serializers as srlzprod

私はこのような問題を抱えていました:

from product import serializers as srlzprod
ModuleNotFoundError: No module named 'product'

私が達成したかったのは次のことです:

class CampaignsProductsSerializers(srlz.DynamicFieldsModelSerializer):
    bank_name = serializers.CharField(trim_whitespace=True,)
    coupon_type = serializers.SerializerMethodField()
    promotion_description = serializers.SerializerMethodField()

    # the nested relation of the line below
    product = srlzprod.ProductsSerializers(fields=['id','name',],read_only=True,)

したがって、上記の行で解決方法(トップレベルのインポート)で述べたように、次の変更を行います。

# change
product = srlzprod.ProductsSerializers(fields=['id','name',],read_only=True,)
# by 
product = serializers.SerializerMethodField()

# and create the following method and call from there the required serializer class
def get_product(self, obj):
        from products import serializers as srlzprod
        p_fields = ['id', 'name', ]
        return srlzprod.ProductsSerializers(
            obj.product, fields=p_fields, many=False,
        ).data

したがって、django runserverは問題なく実行されました:

./project/settings/manage.py runserver 0:8002 --settings=settings_development_mlazo
Performing system checks...

System check identified no issues (0 silenced).
April 25, 2020 - 13:31:56
Django version 2.0.7, using settings 'settings_development_mlazo'
Starting development server at http://0:8002/
Quit the server with CONTROL-C.

コード行の最終的な状態は次のとおりです。

from rest_framework import serializers

from common import serializers as srlz
from prices import models as mdlpri

class CampaignsProductsSerializers(srlz.DynamicFieldsModelSerializer):
    bank_name = serializers.CharField(trim_whitespace=True,)
    coupon_type = serializers.SerializerMethodField()
    promotion_description = serializers.SerializerMethodField()
    product = serializers.SerializerMethodField()

    class Meta:
        model = mdlpri.CampaignsProducts
        fields = '__all__'

    def get_product(self, obj):
        from products import serializers as srlzprod
        p_fields = ['id', 'name', ]
        return srlzprod.ProductsSerializers(
            obj.product, fields=p_fields, many=False,
        ).data

これが他のすべての人に役立つことを願っています。

ご挨拶、


0

私の場合、numpyバージョン1.15.0でpython 2.7を操作すると、

pip install statsmodels=="0.10.0"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.