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?
python
attributeerror
Stephen Hsu
quelle
quelle
Antworten:
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:
Jetzt kann a.py sicher und
import b
ohne Probleme auskommen .(Auf den ersten Blick scheint
cause_a_to_do_something()
dies äußerst ineffizient zu sein, da esimport
jedes 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. )quelle
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,
commands
das 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.quelle
Das Problem ist die zirkuläre Abhängigkeit zwischen den Modulen.
a
Importeb
undb
Importea
. Aber einer von ihnen muss zuerst geladen werden - in diesem Fall initialisiert Python das Modula
zuvorb
undb.hi()
existiert noch nicht, wenn Sie versuchen, darauf zuzugreifena
.quelle
Ich habe diesen Fehler erhalten, indem ich auf eine Aufzählung verwiesen habe, die falsch importiert wurde, z.
Richtiger Import:
Hoffe das hilft jemandem
quelle
Ich habe diesen Fehler festgestellt, weil das Modul nicht tatsächlich importiert wurde. Der Code sah folgendermaßen aus:
Die letzte Zeile ergab eine
AttributeError
. Die Ursache war, dass ich nicht bemerkt hatte, dass die Submodule vona
(a.b
unda.c
) explizit importiert wurden, und davon ausgegangen war, dass dieimport
Anweisung tatsächlich importiert wurdea
.quelle
Ich stand vor dem gleichen Problem. behoben mit
reload
.quelle
Ich bin auf dieses Problem gestoßen, als ich eine ältere Version eines Repositorys von git ausgecheckt habe. Git ersetzte meine
.py
Dateien, ließ aber die nicht verfolgten.pyc
Dateien. Da die.py
Dateien und.pyc
Dateien nicht synchron waren, konnte derimport
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 sie automatisch neu generieren zu lassen.quelle
.pyc
Dateien zu löschen :find . -name "*.pyc" -exec rm -f {} \;
auf ubuntu 18.04 ( virtualenv , python.3.6.x ), der folgenden Reload - Schnipsel gelöst , das Problem für mich:
main.py.
wo:
Weitere Dokumentation finden Sie hier
quelle
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.
quelle
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
quelle
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.py
aber nicht als Modul importiert markiert wird. Also wiederuma.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 wirdb.hi()
, kann es nichts finden.Beachten Sie, dass das
b.hi()
, was ausgeführt wurde, währenda.py
-> Modul b -> Modul a ist, nichta.py
direkt in.In Ihrem speziellen Beispiel können Sie nur
python -c 'import a'
auf oberster Ebene ausführen, sodass die erste Ausführung vona.py
als Import eines Moduls registriert wird.quelle
Die Reihenfolge des Imports war der Grund, warum ich Probleme hatte:
a.py
::b.py
::Nur ein weiteres Beispiel dafür, wie es aussehen könnte, ähnlich wie RichieHindies Antwort, aber mit Klassen.
quelle
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:
Ich hatte ein Problem wie dieses:
Was ich erreichen wollte, war Folgendes:
Wie in den obigen Zeilen erwähnt, wie es zu lösen ist (Import auf oberster Ebene), nehme ich die folgenden Änderungen vor:
Daher wurde django runserver ohne Probleme ausgeführt:
Der Endzustand der Codezeilen war folgender:
Hoffe das könnte für alle anderen hilfreich sein.
Schöne Grüße,
quelle
In meinem Fall funktionierte es mit Python 2.7 mit Numpy Version 1.15.0
quelle