Mam cztery różne pliki o nazwie: main, vector, byt i fizyka. Nie opublikuję całego kodu, tylko import, ponieważ myślę, że tam właśnie jest błąd. (Jeśli chcesz, mogę dodać więcej)
Główny:
import time
from entity import Ent
from vector import Vect
#the rest just creates an entity and prints the result of movement
Jednostka:
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
Wektor:
from math import *
class Vect:
#holds i, j, k, and does vector math
Fizyka:
from entity import Ent
class Physics:
#physics class gets an entity and does physics calculations on it.
Następnie uruchamiam z main.py i pojawia się następujący błąd:
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
Jestem bardzo nowy w Pythonie, ale od dłuższego czasu pracuję z C ++. Zgaduję, że błąd wynika z dwukrotnego importowania bytu, raz głównego, a później fizyki, ale nie znam obejścia. Czy ktoś może pomóc?
from <module> import <name>
, lubfrom <modlue> import *
. Lepiej importować w obszarze nazw modułów, aby uniknąć ryzyka zastąpienia referencji o identycznych nazwach.Entity
iVector
zamiastEnt
iVect
nie ma powodu, aby skracać takie nazwiska. I tak, użyjimport vector
i wtedyx = vector.Vector(0,0,0)
.Odpowiedzi:
Masz import zależny od obiegu.
physics.py
jest importowanyentity
przedEnt
zdefiniowaniem klasy iphysics
próbuje zaimportować,entity
który już się inicjuje. Usuń zależnośćphysics
odentity
modułu.źródło
Entity
iPhysics
połączone ze sobą? Jestem pewien, że istnieje obejście tego, co próbujesz zrobić.Chociaż zdecydowanie powinieneś unikać zależności cyklicznych, możesz odroczyć importowanie w Pythonie.
na przykład:
to (przynajmniej w niektórych przypadkach) obejdzie błąd.
źródło
Jest to zależność cykliczna. Można go rozwiązać bez żadnych zmian strukturalnych w kodzie. Problem występuje, ponieważ
vector
żądaszentity
natychmiastowego udostępnienia do użycia i odwrotnie. Przyczyną tego problemu jest to, że pytasz o dostęp do zawartości modułu, zanim będzie on gotowy - za pomocąfrom x import y
. Jest to zasadniczo to samo coPython jest w stanie wykryć zależności cykliczne i zapobiec nieskończonej pętli importu. Zasadniczo wszystko, co się dzieje, to tworzenie pustego symbolu zastępczego dla modułu (tzn. Nie ma on żadnej zawartości). Po skompilowaniu modułów zależnych od osi aktualizuje importowany moduł. To działa coś takiego.
Aby python mógł pracować z zależnościami cyklicznymi, musisz używać
import x
tylko stylu.Ponieważ nie odwołujesz się już do zawartości modułu na najwyższym poziomie, python może skompilować moduł bez konieczności uzyskiwania dostępu do zawartości zależności cyklicznej. Przez najwyższy poziom rozumiem wiersze, które zostaną wykonane podczas kompilacji, w przeciwieństwie do zawartości funkcji (np.
y = x.y
). Zmienne statyczne lub klasowe uzyskujące dostęp do zawartości modułu również powodują problemy.źródło
Jeśli nie chcesz zmieniać logiki, możesz umieścić instrukcję importu, która spowodowała ImportError, w innej pozycji pliku, na przykład na końcu.
a.py
b.py
Ale jeśli zmienimy pozycję z test.b importuj b2 do A, jak poniżej:
a.py
I możemy dostać to, czego chcemy:
źródło
Jest to zależność cykliczna. możemy rozwiązać ten problem za pomocą modułu lub klasy importu lub funkcji tam, gdzie potrzebowaliśmy. jeśli zastosujemy to podejście, możemy naprawić zależność cykliczną
A.py
B.py
źródło
Właśnie dostałem ten błąd z innego powodu ...
Główny skrypt miał zakończenia linii Windows.
my_sub_module
miał zakończenia linii UNIX. Zmiana ich na takie same rozwiązała problem. Muszą także mieć to samo kodowanie znaków.źródło
Jak już wspomniano, jest to spowodowane zależnością cykliczną . Nie wspomniano jednak, że jeśli używasz modułu pisania w języku Python i importujesz klasę tylko w celu opisywania typów , możesz użyć odwołań do przodu :
i usuń zależność ( import ), np. zamiast
zrobić:
(zwróć uwagę na usunięte
import
oświadczenie)źródło
Nie nazywaj swojego obecnego skryptu python nazwą innego importowanego modułu
Rozwiązanie: zmień nazwę działającego skryptu Python
Przykład:
medicaltorch.py
from medicaltorch import datasets as mt_datasets
gdziemedicaltorch
powinien być zainstalowany modułTo się nie powiedzie z
ImportError
. Po prostu zmień nazwę swojego działającego skryptu Python w 1.źródło
Nie widzę tego tutaj jeszcze - jest to niesamowicie głupie, ale upewnij się, że importujesz poprawną zmienną / funkcję.
Otrzymałem ten błąd
ponieważ moja zmienna była w rzeczywistości
IMPLICIT_TIMEOUT
.po zmianie importu na poprawną nazwę nie pojawia się już błąd 🤦♂️
źródło
from PIL import Pillow
nie działa. 😠Jeśli importujesz
file1.py
odfile2.py
i używane to:Zmienne poniżej tego IN
file1.py
nie mogą być importowane dofile2.py
ponieważ__name__
nie równa__main__
!Jeśli chcesz importować coś od
file1.py
celufile2.py
, trzeba korzystać z tego wfile1.py
:W razie wątpliwości należy złożyć
assert
oświadczenie, aby ustalić, czy__name__=='__main__'
źródło
Jednym ze sposobów śledzenia błędu importu jest próba uruchomienia Pythona na każdym z importowanych plików, aby wyśledzić zły.
dostajesz coś takiego:
następnie uruchom:
następnie uruchom:
źródło
Również nie ma bezpośredniego związku z OP, ale nie zrestartowanie konsoli Python PyCharm po dodaniu nowego obiektu do modułu jest również świetnym sposobem na bardzo mylące
ImportError: Cannot import name ...
Mylące jest to, że PyCharm automatycznie uzupełni import w konsoli, ale import nie powiedzie się.
źródło
Problem jest jasny: zależność cykliczna między nazwami w
entity
iphysics
modułów.Bez względu na import całego modułu lub tylko klasy, nazwy muszą zostać załadowane.
Zobacz ten przykład:
Zostanie to skompilowane w:
Za pomocą jednej niewielkiej zmiany możemy rozwiązać ten problem:
Zostanie to skompilowane w:
źródło
W moim przypadku pracowałem w notatniku Jupyter i działo się tak, ponieważ import był już buforowany, gdy zdefiniowałem klasę / funkcję w moim pliku roboczym.
Uruchomiłem ponownie jądro Jupyter i błąd zniknął.
źródło
Nie specjalnie dla tego pytającego, ale ten sam błąd pokaże, czy nazwa klasy w imporcie nie zgadza się z definicją w pliku, z którego importujesz.
źródło