Ich habe vier verschiedene Dateien mit dem Namen: Haupt, Vektor, Entität und Physik. Ich werde nicht den gesamten Code veröffentlichen, sondern nur die Importe, da ich denke, dass dort der Fehler liegt. (Wenn du willst, kann ich mehr posten)
Main:
import time
from entity import Ent
from vector import Vect
#the rest just creates an entity and prints the result of movement
Entität:
from vector import Vect
from physics import Physics
class Ent:
#holds vector information and id
def tick(self, dt):
#this is where physics changes the velocity and position vectors
Vektor:
from math import *
class Vect:
#holds i, j, k, and does vector math
Physik:
from entity import Ent
class Physics:
#physics class gets an entity and does physics calculations on it.
Ich starte dann von main.py und erhalte die folgende Fehlermeldung:
Traceback (most recent call last): File "main.py", line 2, in <module> from entity import Ent File ".../entity.py", line 5, in <module> from physics import Physics File ".../physics.py", line 2, in <module> from entity import Ent ImportError: cannot import name Ent
Ich bin sehr neu in Python, habe aber lange mit C ++ gearbeitet. Ich vermute, dass der Fehler auf das zweimalige Importieren einer Entität zurückzuführen ist, einmal in der Haupt- und später in der Physik, aber ich kenne keine Problemumgehung. Kann jemand helfen?
from <module> import <name>
, oderfrom <modlue> import *
. Besser unter dem Modul-Namespace importieren, um zu verhindern, dass identisch benannte Referenzen überschrieben werden.Entity
undVector
anstelle vonEnt
undVect
gibt es keinen Grund, solche Namen zu kürzen. Und ja, benutzeimport vector
und dannx = vector.Vector(0,0,0)
.Antworten:
Sie haben zirkularabhängige Importe.
physics.py
wird importiert,entity
bevor die KlasseEnt
definiert wurde, undphysics
versucht zu importierenentity
, was bereits initialisiert wird. Entfernen Sie die Abhängigkeitphysics
vomentity
Modul.quelle
Entity
undPhysics
miteinander verbunden? Ich bin sicher, es gibt eine Problemumgehung für das, was Sie versuchen zu tun.Während Sie zirkuläre Abhängigkeiten auf jeden Fall vermeiden sollten, können Sie Importe in Python verschieben.
zum Beispiel:
Dies umgeht (zumindest in einigen Fällen) den Fehler.
quelle
Dies ist eine zirkuläre Abhängigkeit. Es kann ohne strukturelle Änderungen am Code gelöst werden. Das Problem tritt auf, weil
vector
Sie verlangen, dass esentity
sofort zur Verfügung gestellt wird, und umgekehrt. Der Grund für dieses Problem ist, dass Sie nach dem Zugriff auf den Inhalt des Moduls fragen, bevor es bereit ist - mithilfe vonfrom x import y
. Dies ist im Wesentlichen das gleiche wiePython ist in der Lage, zirkuläre Abhängigkeiten zu erkennen und die Endlosschleife von Importen zu verhindern. Im Wesentlichen wird lediglich ein leerer Platzhalter für das Modul erstellt (dh es enthält keinen Inhalt). Sobald die zirkular abhängigen Module kompiliert sind, wird das importierte Modul aktualisiert. Das funktioniert so ähnlich.
Damit Python mit zirkulären Abhängigkeiten arbeiten kann, müssen Sie
import x
nur den Stil verwenden.Da Sie sich nicht mehr auf den Inhalt des Moduls auf der obersten Ebene beziehen, kann Python das Modul kompilieren, ohne tatsächlich auf den Inhalt der zirkulären Abhängigkeit zugreifen zu müssen. Mit oberster Ebene meine ich Zeilen, die während der Kompilierung ausgeführt werden, im Gegensatz zum Inhalt von Funktionen (z. B.
y = x.y
). Statische oder Klassenvariablen, die auf den Modulinhalt zugreifen, verursachen ebenfalls Probleme.quelle
Wenn Sie die Logik nicht ändern möchten, können Sie die import-Anweisung, die ImportError verursacht hat, an die andere Position der Datei setzen, z. B. an das Ende.
a.py.
b.py.
Aber wenn wir die Position von aus test.b ändern, importieren Sie b2 in A wie folgt:
a.py.
Und das können wir bekommen, was wir wollen:
quelle
Dies ist eine zirkuläre Abhängigkeit. Wir können dieses Problem lösen, indem wir das Importmodul oder die Klasse oder Funktion dort verwenden, wo wir es benötigen. Wenn wir diesen Ansatz verwenden, können wir die zirkuläre Abhängigkeit beheben
A.py.
B.py.
quelle
Ich habe diesen Fehler auch aus einem anderen Grund erhalten ...
Das Hauptskript hatte Windows-Zeilenenden.
my_sub_module
hatte UNIX-Zeilenenden. Das Problem wurde behoben, indem das gleiche geändert wurde. Sie müssen auch die gleiche Zeichenkodierung haben.quelle
Wie bereits erwähnt, wird dies durch eine zirkuläre Abhängigkeit verursacht . Was wurde nicht erwähnt ist , dass , wenn Sie Python verwenden Eingabe - Modul und eine Klasse importieren nur annotate verwendet werden Typen , die Sie verwenden können Weiterleiten Referenzen :
und entfernen Sie die Abhängigkeit (den Import ), z. B. anstelle von
tun:
(Beachten Sie die entfernte
import
Aussage)quelle
Benennen Sie Ihr aktuelles Python-Skript nicht mit dem Namen eines anderen Moduls, das Sie importieren
Lösung: Benennen Sie Ihr funktionierendes Python-Skript um
Beispiel:
medicaltorch.py
from medicaltorch import datasets as mt_datasets
Womedicaltorch
soll ein installiertes Modul sein?Dies wird mit dem fehlschlagen
ImportError
. Benennen Sie einfach Ihr funktionierendes Python-Skript in 1 um.quelle
Sehen Sie diese hier noch nicht - das ist unglaublich dumm, aber stellen Sie sicher, dass Sie die richtige Variable / Funktion importieren.
Ich habe diesen Fehler erhalten
weil meine Variable eigentlich war
IMPLICIT_TIMEOUT
.Als ich meinen Import geändert habe, um den richtigen Namen zu verwenden, wurde der Fehler 🤦♂️ nicht mehr angezeigt
quelle
from PIL import Pillow
es nicht funktionierte. 😠Wenn Sie importieren
file1.py
ausfile2.py
und verwendet diese:Variablen darunter
file1.py
können nicht importiert werden ,file2.py
da__name__
dies nicht gleich ist__main__
!Wenn Sie etwas von importieren möchten
file1.py
zufile2.py
, müssen Sie dies nutzen infile1.py
:Geben Sie im Zweifelsfall eine
assert
Erklärung ab, um festzustellen, ob__name__=='__main__'
quelle
Eine Möglichkeit, Importfehler zu verfolgen, besteht darin, Schritt für Schritt zu versuchen, Python für jede importierte Datei auszuführen, um eine fehlerhafte Datei aufzuspüren.
Sie bekommen so etwas wie:
dann starten Sie:
dann starten Sie:
quelle
Auch nicht direkt relevant für das OP, aber wenn eine PyCharm Python-Konsole nach dem Hinzufügen eines neuen Objekts zu einem Modul nicht neu gestartet werden kann, ist dies auch eine gute Möglichkeit, sehr verwirrend zu werden
ImportError: Cannot import name ...
Das verwirrende Teil ist , dass PyCharm wird der Import in der Konsole automatisch vervollständigt, aber der Import fehlschlägt dann.
quelle
Das Problem ist klar: Zirkuläre Abhängigkeit zwischen Namen in
entity
undphysics
Modulen.Unabhängig davon, ob das gesamte Modul oder nur eine Klasse importiert wird, müssen die Namen geladen werden.
Sehen Sie sich dieses Beispiel an:
Dies wird zusammengestellt in:
Mit einer kleinen Änderung können wir dies lösen:
Dies wird zusammengestellt in:
quelle
In meinem Fall arbeitete ich in einem Jupyter-Notizbuch und dies geschah, weil der Import bereits zwischengespeichert wurde, als ich die Klasse / Funktion in meiner Arbeitsdatei definiert hatte.
Ich habe meinen Jupyter-Kernel neu gestartet und der Fehler ist verschwunden.
quelle
Nicht speziell für diesen Fragesteller, aber der gleiche Fehler zeigt an, ob der Klassenname in Ihrem Import nicht mit der Definition in der Datei übereinstimmt, aus der Sie importieren.
quelle