it-swarm.com.de

AttributeError: 'Modul'-Objekt hat kein Attribut

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 a.py starte, bekomme ich:

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

Was bedeutet der Fehler? Wie kann ich das beheben?

150
Stephen Hsu

Sie haben gegenseitige Importe auf oberster Ebene, was fast immer eine schlechte Idee ist.

Wenn Sie wirklich gegenseitige Importe in Python benötigen, können Sie sie in eine Funktion importieren:

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

Jetzt kann a.py import b sicher ausführen, ohne Probleme zu verursachen.

(Auf den ersten Blick könnte es scheinen, dass cause_a_to_do_something() äußerst ineffizient ist, da bei jedem Aufruf eine import ausgeführt wird. Tatsächlich wird die Importarbeit jedoch nur beim ersten Mal ausgeführt. Beim zweiten und nachfolgenden Importieren eines Moduls ist dies ein schneller Vorgang Operation.)

157
RichieHindle

Ich habe diesen Fehler auch gesehen, als ich versehentlich ein Modul benannte, das denselben Namen wie eines der Standard-Python-Module hat. Z.B. Ich hatte ein Modul namens commands, das auch ein Python-Bibliotheksmodul ist. Dies war schwierig zu finden, da es in meiner lokalen Entwicklungsumgebung ordnungsgemäß funktioniert hat, aber der Fehler bei der Ausführung von Google App Engine fehlgeschlagen ist.

74
lucrussell

Das Problem ist die zirkuläre Abhängigkeit zwischen den Modulen. a importiert b und b importiert a. Eine davon muss jedoch zuerst geladen werden. In diesem Fall initialisiert Python das Modul a, bevor b und b.hi() noch nicht vorhanden sind, wenn Sie versuchen, in a darauf zuzugreifen.

39
sth

Ich habe diesen Fehler erhalten, indem ich auf ein falsches importiertes Enumevergegriffen habe, z.

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

Korrekter Import:

from package.MyEnumClass import MyEnumClass

Hoffe das hilft jemandem

16
Stoyan

Dieser Fehler ist aufgetreten, da das Modul nicht wirklich importiert wurde. Der Code sah so 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.b und a.c) explizit importiert wurden, und davon ausgegangen ist, dass die import-Anweisung tatsächlich a importierte.

7
Dag Høidahl

Dieses Problem trat auf, als ich eine ältere Version eines Repositorys von git auscheckte. Git ersetzte meine .py-Dateien, ließ jedoch die nicht protokollierten .pyc-Dateien zurück. Da die .py-Dateien und .pyc-Dateien nicht synchron waren, konnte der import-Befehl in einer .py-Datei das entsprechende Modul in den .pyc-Dateien nicht finden.

Die Lösung bestand einfach darin, die .pyc-Dateien zu löschen und automatisch neu generieren zu lassen.

3
craq

Ich stand vor dem gleichen Problem. behoben mit reload.

import the_module_name
from importlib import reload
reload(the_module_name)
2
Jiu

Alle oben genannten Antworten sind großartig, aber ich würde gerne hier reinspringen. Wenn Sie keine der oben genannten Probleme festgestellt haben, versuchen Sie, Ihre Arbeitsumgebung zu klären. Es hat für mich funktioniert.

2
Jian

am ubuntu 18.04 ( virtualenv , python.3.6.x ), das folgende Reload Snippet gelöst das problem für mich:

main.py

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

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

woher:

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

weitere Dokumentationen finden Sie unter: hier

0
Behzad Sezar

Zirkularimporte verursachen Probleme, aber Python hat Möglichkeiten, das eingebaute System abzuschwächen.

Das Problem ist, wenn Sie python a.py ausführen, wird a.py ausgeführt, aber nicht als importiert markiert. Also wiederum a.py -> Importmodul b -> Importmodul a -> Importmodul b. Der letzte Import a no-op seit b wird gerade importiert und Python schützt dagegen. Und b ist vorerst ein leeres Modul. Wenn es also b.hi() ausführt, kann es nichts finden.

Beachten Sie, dass die b.hi(), die ausgeführt wurde, sich während a.py -> Modul b -> Modul a befindet und nicht direkt in a.py.

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

0
Hot.PxL

@ MD5 Das Gleiche gilt für mich. Ändern Sie den Modulnamen oder importieren Sie die Funktion direkt

0
Patrick

Nicht sicher wie, aber die Änderung unten hat mein Problem sortiert:

ich hatte den Namen der Datei und den Namen des Imports. Ich hatte beispielsweise den Dateinamen emoji.py und versuchte, Emoji zu importieren. Durch das Ändern des Dateinamens wurde das Problem behoben.

Hoffe, es hilft

0
MD5