У меня есть четыре разных файла: основной, векторный, объект и физика. Я не буду публиковать весь код, только импорт, потому что я думаю, что здесь ошибка. (Если хотите, могу выложить больше)
Главный:
import time
from entity import Ent
from vector import Vect
#the rest just creates an entity and prints the result of movement
Сущность:
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
Вектор:
from math import *
class Vect:
#holds i, j, k, and does vector math
Физика:
from entity import Ent
class Physics:
#physics class gets an entity and does physics calculations on it.
Затем я запускаю из main.py и получаю следующую ошибку:
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
Я очень плохо знаком с Python, но долгое время работал с C ++. Я предполагаю, что ошибка происходит из-за импорта сущности дважды, один раз в основную, а затем в физике, но я не знаю обходного пути. Кто-нибудь может помочь?
from <module> import <name>
, илиfrom <modlue> import *
. Лучше импортировать в пространство имен модуля, чтобы исключить возможность перезаписи ссылок с одинаковыми именами.Entity
иVector
вместоEnt
иVect
нет причин сокращать такие имена. И да, используйтеimport vector
и тогдаx = vector.Vector(0,0,0)
.Ответы:
У вас есть круговой зависимый импорт.
physics.py
импортируетсяentity
доEnt
определения класса иphysics
пытается импортироватьentity
уже инициализированный. Удалить зависимостьphysics
отentity
модуля.источник
Entity
иPhysics
связаны друг с другом? Я уверен, что есть обходной путь для того, что вы пытаетесь сделать.Хотя вам определенно следует избегать циклических зависимостей, вы можете отложить импорт в python.
например:
это (по крайней мере, в некоторых случаях) обойдет ошибку.
источник
Это круговая зависимость. Это может быть решено без каких-либо структурных изменений в коде. Проблема возникает потому, что
vector
вы требуете,entity
чтобы сделать доступными для использования немедленно, и наоборот. Причиной этой проблемы является то, что вы запрашиваете доступ к содержимому модуля, прежде чем он будет готов - с помощьюfrom x import y
. Это по сути так же, какPython способен обнаруживать циклические зависимости и предотвращать бесконечный цикл импорта. По сути, все, что происходит, - это то, что для модуля создается пустой заполнитель (т.е. он не имеет содержимого). Как только циклически зависимые модули скомпилированы, он обновляет импортированный модуль. Это работает примерно так.
Чтобы Python мог работать с циклическими зависимостями, вы должны использовать
import x
только стиль.Поскольку вы больше не обращаетесь к содержимому модуля на верхнем уровне, python может скомпилировать модуль без фактического доступа к содержимому циклической зависимости. Под верхним уровнем я подразумеваю строки, которые будут выполняться во время компиляции, а не содержимое функций (например,
y = x.y
). Статические переменные или переменные класса, обращающиеся к содержимому модуля, также вызовут проблемы.источник
Если вы не хотите менять логику, вы можете поместить оператор import, который вызвал ImportError, в другую позицию файла, например в конец.
a.py
b.py
Но если мы изменим позицию из test.b import b2 в A, как показано ниже:
a.py
И мы можем получить то, что мы хотим:
источник
Это круговая зависимость. мы можем решить эту проблему, используя модуль импорта или класс или функцию там, где нам нужно. если мы используем этот подход, мы можем исправить круговую зависимость
A.py
B.py
источник
Я тоже получил эту ошибку, по другой причине ...
Основной скрипт имел окончания строк в Windows.
my_sub_module
имел окончания строки UNIX. Изменение их на одно и то же решило проблему. Они также должны иметь одинаковую кодировку символов.источник
Как уже упоминалось, это вызвано круговой зависимостью . Что не было упомянуто, так это то, что когда вы используете модуль типирования Python и импортируете класс только для аннотирования типов , вы можете использовать прямые ссылки :
и удалить зависимость ( импорт ), например, вместо
делать:
(обратите внимание на удаленное
import
утверждение)источник
Не называйте ваш текущий скрипт Python именем какого-либо другого модуля, который вы импортируете
Решение: переименуйте ваш рабочий скрипт на Python
Пример:
medicaltorch.py
from medicaltorch import datasets as mt_datasets
гдеmedicaltorch
должен быть установлен модульЭто не удастся с
ImportError
. Просто переименуйте ваш рабочий скрипт на Python в 1.источник
Пока не видите этого - это невероятно глупо, но убедитесь, что вы импортируете правильную переменную / функцию.
Я получаю эту ошибку
потому что моя переменная была на самом деле
IMPLICIT_TIMEOUT
.когда я изменил свой импорт, чтобы использовать правильное имя, я больше не получил ошибку 🤦♂️
источник
from PIL import Pillow
не работает. AЕсли вы импортируете
file1.py
изfile2.py
и использовать это:Переменные ниже, чем в
file1.py
не могут быть импортированы вfile2.py
потому , что__name__
не равно__main__
!Если вы хотите импортировать что-то из
file1.py
вfile2.py
, вам нужно использовать это вfile1.py
:В случае сомнений сделайте
assert
заявление, чтобы определить,__name__=='__main__'
источник
Один из способов отследить ошибку импорта - пошаговая попытка запустить python для каждого из импортированных файлов, чтобы отследить плохой.
вы получите что-то вроде:
тогда вы запускаете:
тогда вы запускаете:
источник
Также не имеет непосредственного отношения к OP, но не удается перезапустить консоль PyCharm Python после добавления нового объекта в модуль, также является отличным способом запутать
ImportError: Cannot import name ...
Заблуждение заключается в том, что PyCharm автоматически завершит импорт в консоли, но импорт завершится неудачно.
источник
Проблема ясна: круговая зависимость между именами
entity
иphysics
модулями.Независимо от импорта всего модуля или только класса, имена должны быть загружены.
Посмотрите этот пример:
Это будет скомпилировано в:
С одним небольшим изменением мы можем решить это:
Это будет скомпилировано в:
источник
В моем случае я работал в записной книжке Jupyter, и это происходило из-за того, что импорт уже кэшировался, когда я определил класс / функцию внутри моего рабочего файла.
Я перезапустил свое ядро Jupyter, и ошибка исчезла.
источник
Не специально для этого автора, но эта же ошибка будет отображаться, если имя класса в вашем импорте не соответствует определению в файле, из которого вы импортируете.
источник