AttributeError: Das Objekt 'module' hat kein Attribut

193

Ich habe zwei Python-Module:

a.py.

import b

def hello():
  print "hello"

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

b.py.

import a

def hi():
  print "hi"

Wenn ich renne a.py, bekomme ich:

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

Was bedeutet der Fehler? Wie behebe ich das?

Stephen Hsu
quelle
Beachten Sie, dass Ihre Fragen dieser Antwort sehr ähnlich sind. Anscheinend funktioniert der Code in dieser Antwort nur finden, aber Ihr nicht? stackoverflow.com/a/7336880/565879
Buttons840

Antworten:

188

Sie haben gegenseitige Top-Level-Importe, was fast immer eine schlechte Idee ist.

Wenn Sie wirklich gegenseitige Importe in Python benötigen, müssen Sie diese in eine Funktion importieren:

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

Jetzt kann a.py sicher und import bohne Probleme auskommen .

(Auf den ersten Blick scheint cause_a_to_do_something()dies äußerst ineffizient zu sein, da es importjedes Mal ausgeführt wird, wenn Sie es aufrufen. Tatsächlich wird die Importarbeit jedoch nur beim ersten Mal ausgeführt. Beim zweiten und nachfolgenden Importieren eines Moduls ist dies ein schneller Vorgang. )

RichieHindle
quelle
92

Ich habe diesen Fehler auch gesehen, als ich versehentlich ein Modul mit demselben Namen wie eines der Standard-Python-Module benannt habe. ZB hatte ich ein Modul namens, commandsdas auch ein Python-Bibliotheksmodul ist. Dies erwies sich als schwierig zu ermitteln, da es in meiner lokalen Entwicklungsumgebung ordnungsgemäß funktionierte, jedoch mit dem angegebenen Fehler bei der Ausführung unter Google App Engine fehlschlug.

lucrussell
quelle
42

Das Problem ist die zirkuläre Abhängigkeit zwischen den Modulen. aImporte bund bImporte a. Aber einer von ihnen muss zuerst geladen werden - in diesem Fall initialisiert Python das Modul azuvor bund b.hi()existiert noch nicht, wenn Sie versuchen, darauf zuzugreifen a.

etw
quelle
21

Ich habe diesen Fehler erhalten, indem ich auf eine Aufzählung verwiesen habe, die falsch importiert wurde, z.

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

Richtiger Import:

from package.MyEnumClass import MyEnumClass

Hoffe das hilft jemandem

Stoyan
quelle
7

Ich habe diesen Fehler festgestellt, weil das Modul nicht tatsächlich importiert wurde. Der Code sah folgendermaßen aus:

import a.b, a.c

# ...

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

Die letzte Zeile ergab eine AttributeError. Die Ursache war, dass ich nicht bemerkt hatte, dass die Submodule von a( a.bund a.c) explizit importiert wurden, und davon ausgegangen war, dass die importAnweisung tatsächlich importiert wurde a.

Dag Høidahl
quelle
6

Ich stand vor dem gleichen Problem. behoben mit reload.

import the_module_name
from importlib import reload
reload(the_module_name)
Nur wir
quelle
Danke, dies ist die einzige Antwort, die für mich funktioniert hat :)
TheTechRobo36414519
5

Ich bin auf dieses Problem gestoßen, als ich eine ältere Version eines Repositorys von git ausgecheckt habe. Git ersetzte meine .pyDateien, ließ aber die nicht verfolgten .pycDateien. Da die .pyDateien und .pycDateien nicht synchron waren, konnte der importBefehl in einer .pyDatei das entsprechende Modul in den .pycDateien nicht finden .

Die Lösung bestand einfach darin, die .pycDateien zu löschen und sie automatisch neu generieren zu lassen.

craq
quelle
Sie können diesen Befehl verwenden, um alle .pycDateien zu löschen :find . -name "*.pyc" -exec rm -f {} \;
Ollie
4

auf ubuntu 18.04 ( virtualenv , python.3.6.x ), der folgenden Reload - Schnipsel gelöst , das Problem für mich:

main.py.

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

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

wo:

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

Weitere Dokumentation finden Sie hier

Behzad Sezari
quelle
3

Alle oben genannten Antworten sind großartig, aber ich würde gerne hier einschalten. Wenn Sie oben kein Problem festgestellt haben, versuchen Sie, Ihre Arbeitsumgebung zu bereinigen. Es hat bei mir funktioniert.

Jian
quelle
0

Ich bin mir nicht sicher, wie, aber die folgende Änderung hat mein Problem gelöst:

Ich hatte den gleichen Namen wie die Datei und den gleichen Importnamen, z. B. hatte ich den Dateinamen emoji.py und versuchte, Emoji zu importieren. Das Ändern des Dateinamens löste das Problem.

Hoffe so hilft es

MD5
quelle
0

Zirkuläre Importe verursachen Probleme, aber Python bietet Möglichkeiten, diese zu reduzieren.

Das Problem ist, dass es beim Ausführen ausgeführt python a.py, a.pyaber nicht als Modul importiert markiert wird. Also wiederum a.py-> importiert Modul b -> importiert Modul a -> importiert Modul b. Der letzte Import a no-op seit b wird gerade importiert und Python schützt davor. Und b ist vorerst ein leeres Modul. Wenn es ausgeführt wird b.hi(), kann es nichts finden.

Beachten Sie, dass das b.hi(), was ausgeführt wurde, während a.py-> Modul b -> Modul a ist, nicht a.pydirekt in.

In Ihrem speziellen Beispiel können Sie nur python -c 'import a'auf oberster Ebene ausführen, sodass die erste Ausführung von a.pyals Import eines Moduls registriert wird.

Hot.PxL
quelle
0

Die Reihenfolge des Imports war der Grund, warum ich Probleme hatte:

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

Nur ein weiteres Beispiel dafür, wie es aussehen könnte, ähnlich wie RichieHindies Antwort, aber mit Klassen.

jmunsch
quelle
0

Ich habe mich oft mit diesem Thema auseinandergesetzt, aber ich habe nicht versucht, tiefer darüber zu graben. Jetzt verstehe ich das Hauptproblem.

Dieses Mal bestand mein Problem darin, Serializer (Django und Restframework) aus verschiedenen Modulen wie den folgenden zu importieren:

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

Ich hatte ein Problem wie dieses:

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

Was ich erreichen wollte, war Folgendes:

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,)

Wie in den obigen Zeilen erwähnt, wie es zu lösen ist (Import auf oberster Ebene), nehme ich die folgenden Änderungen vor:

# 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

Daher wurde django runserver ohne Probleme ausgeführt:

./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.

Der Endzustand der Codezeilen war folgender:

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

Hoffe das könnte für alle anderen hilfreich sein.

Schöne Grüße,

Manuel Lazo
quelle
0

In meinem Fall funktionierte es mit Python 2.7 mit Numpy Version 1.15.0

pip install statsmodels=="0.10.0"
Mondaa
quelle