Подтвердить что ты не робот

ImportError: невозможно импортировать имя X

У меня есть четыре разных файла с именем: main, vector, entity и физика. Я не буду публиковать весь код, просто импорт, потому что я думаю, что там, где ошибка. (Если вы хотите, я могу разместить больше)

Главный:

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++ в течение длительного времени. Я предполагаю, что ошибка связана с импортом объекта дважды, один раз в основной, а затем в физику, но я не знаю обходного пути. Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

У вас есть циклический зависимый импорт. physics.py импортируется из entity до определения класса Ent и physics пытается импортировать entity, который уже инициализируется. Удалите зависимость от physics от модуля entity.

Ответ 2

В то время как вы обязательно должны избегать циклических зависимостей, вы можете отложить импорт в python.

например:

import SomeModule

def someFunction(arg):
    from some.dependency import DependentClass

это (по крайней мере, в некоторых случаях) обойдет ошибку.

Ответ 3

Это циклическая зависимость. Его можно решить без каких-либо структурных изменений кода. Проблема возникает, потому что в vector вы требуете, чтобы entity был доступен для использования сразу, и наоборот. Причина этой проблемы заключается в том, что вы запрашиваете доступ к содержимому модуля до его готовности - с помощью from x import y. Это по существу то же самое, что

import x
y = x.y
del x

Python способен обнаруживать циклические зависимости и предотвращать бесконечный цикл импорта. По сути, все, что происходит, это то, что для модуля создается пустой заполнитель (т.е. Он не имеет содержимого). После компиляции циклически зависимых модулей он обновляет импортированный модуль. Это работает примерно так.

a = module() # import a

# rest of module

a.update_contents(real_a)

Чтобы python мог работать с круговыми зависимостями, вы должны использовать только стиль import x.

import x
class cls:
    def __init__(self):
        self.y = x.y

Поскольку вы больше не ссылаетесь на содержимое модуля на верхнем уровне, python может скомпилировать модуль, фактически не имея доступа к содержимому циклической зависимости. Под верхним уровнем я подразумеваю строки, которые будут выполняться во время компиляции, в отличие от содержимого функций (например, y = x.y). Статические переменные или переменные класса, обращающиеся к содержимому модуля, также могут вызывать проблемы.

Ответ 4

Чтобы сделать логику понятной, очень важно. Эта проблема возникает, потому что ссылка становится мертвой петлей.

Если вы не хотите изменять логику, вы можете поместить некоторый оператор import, который вызвал импорт ImportError в другую позицию файла, например, конец.

a.py

from test.b import b2

def a1():
    print('a1')
    b2()

b.py

from test.a import a1

def b1():
    print('b1')
    a1()

def b2():
    print('b2')

if __name__ == '__main__':
    b1()

Вы получите Импорт Ошибка: ImportError: cannot import name 'a1'

Но если мы изменим позицию из test.b import b2 в A, как показано ниже:

a.py

def a1():
    print('a1')
    b2()

from test.b import b2

И мы можем получить то, что хотим:

b1
a1
b2

Ответ 5

Я тоже получил эту ошибку по другой причине...

from my_sub_module import my_function

В главном script были завершены строки Windows. my_sub_module имеет окончание строки UNIX. Изменение их, чтобы они были одинаковыми, устранили проблему. Они также должны иметь одинаковую кодировку символов.

Ответ 6

Это круговая зависимость. мы можем решить эту проблему, используя модуль импорта или класс или функцию там, где нам нужно. если мы используем этот подход, мы можем исправить круговую зависимость

A.py

from B import b2
def a1():
    print('a1')
    b2()

B.py

def b1():
   from A import a1
   print('b1')
   a1()

def b2():
   print('b2')
if __name__ == '__main__':
   b1() 

Ответ 7

Не называйте свой текущий скрипт Python именем какого-либо другого модуля, который вы импортируете

Решение: переименуйте ваш рабочий скрипт на Python

Пример:

  1. вы работаете в medicaltorch.py
  2. в этом скрипте вы имеете: from medicaltorch import datasets as mt_datasets medicaltorch from medicaltorch import datasets as mt_datasets где предполагается, что medicaltorch является установленным модулем

Это не удастся с помощью ImportError. Просто переименуйте ваш рабочий скрипт на Python в 1.

Ответ 8

Пока не видите этого - это невероятно глупо, но убедитесь, что вы импортируете правильную переменную/функцию.

Я получаю эту ошибку

ImportError: невозможно импортировать имя IMPLICIT_WAIT

потому что моя переменная была на самом деле IMPLICIT_TIMEOUT.

когда я изменил свой импорт, чтобы использовать правильное имя, я больше не получил ошибку 🤦‍♂️

Ответ 9

Не специально для этого автора, но эта же ошибка будет отображаться, если имя класса в вашем импорте не соответствует определению в файле, из которого вы импортируете.

Ответ 10

Python чувствителен к регистру, поэтому entity!= entity. Я предлагаю вам изменить корпус entity в вашем импорте как entity. Это устранит вашу проблему.

Ответ 11

Ваша основная должна быть такой Main:

import time
from entity import *
from vector import *
#the rest just creates an entity and prints the result of movement