关于python:importError:无法导入名称x

ImportError: Cannot import name X

我有四个不同的文件,分别是:主文件、向量文件、实体文件和物理文件。我不会发布所有的代码,只发布导入的代码,因为我认为这就是错误所在。(如果你愿意,我可以多发一些)

主营:

1
2
3
4
import time
from entity import Ent
from vector import Vect
#the rest just creates an entity and prints the result of movement

实体:

1
2
3
4
5
6
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

矢量:

1
2
3
from math import *
class Vect:
    #holds i, j, k, and does vector math

物理学:

1
2
3
from entity import Ent
class Physics:
    #physics class gets an entity and does physics calculations on it.

然后我从main.py运行,得到以下错误:

1
2
3
4
5
6
7
8
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++工作了很长时间。我猜这个错误是由于两次导入实体造成的,一次导入主体,后来导入物理,但我不知道如何解决这个问题。有人能帮忙吗?


您有循环依赖导入。physics.py在定义类Ent之前从entity导入,physics尝试导入已经初始化的entity。从entity模块中删除对physics的依赖。


虽然您绝对应该避免循环依赖关系,但可以在Python中延迟导入。

例如:

1
2
3
4
import SomeModule

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

这(至少在某些情况下)将规避错误。


这是循环依赖关系。它不需要对代码进行任何结构修改就可以解决。问题的出现是因为在vector中,您要求立即提供entity供使用,反之亦然。这个问题的原因是,您在模块准备就绪之前请求访问模块的内容——使用from x import y。这基本上与

1
2
3
import x
y = x.y
del x

python能够检测循环依赖关系并防止无限循环的导入。本质上,所有发生的事情都是为模块创建一个空的占位符(即它没有内容)。一旦循环相关模块被编译,它就会更新导入的模块。这是这样的工作。

1
2
3
4
5
a = module() # import a

# rest of module

a.update_contents(real_a)

为了让python能够处理循环依赖项,您必须只使用import x样式。

1
2
3
4
import x
class cls:
    def __init__(self):
        self.y = x.y

由于不再在顶层引用模块的内容,所以Python可以编译模块,而实际上不必访问循环依赖项的内容。在顶层,我指的是将在编译期间执行的行,而不是函数的内容(如y = x.y)。访问模块内容的静态或类变量也会导致问题。


To make logic clear is very important. This problem appear, because the reference become a dead loop.

如果不想更改逻辑,可以将导致importError的某些import语句放在文件的另一个位置,例如end。

A.Py

1
2
3
4
5
from test.b import b2

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

B.Py

1
2
3
4
5
6
7
8
9
10
11
from test.a import a1

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

def b2():
    print('b2')

if __name__ == '__main__':
    b1()

You will get Import Error: ImportError: cannot import name 'a1'

但是,如果我们在下面的a中更改了from test.b import b2的位置:

A.Py

1
2
3
4
5
def a1():
    print('a1')
    b2()

from test.b import b2

我们可以得到我们想要的:

1
2
3
b1
a1
b2

我也犯了这个错误,因为另一个原因…

1
from my_sub_module import my_function

主脚本有Windows行结尾。my_sub_module有unix行尾。把它们改成相同的,解决了问题。它们还需要具有相同的字符编码。


不要用导入的其他模块的名称命名当前的python脚本

解决方案:重命名正在运行的python脚本

例子:

  • 你在medicaltorch.py工作
  • 在该脚本中,您有:from medicaltorch import datasets as mt_datasets,其中medicaltorch应该是已安装的模块
  • 这将在ImportError中失败。只需在1中重命名正在运行的python脚本。


    在这里还没有看到这个-这是非常愚蠢的,但是要确保导入的是正确的变量/函数。

    我得到这个错误

    ImportError: cannot import name IMPLICIT_WAIT

    因为我的变量实际上是IMPLICIT_TIMEOUT

    当我更改导入以使用正确的名称时,我不再收到错误?????


    python区分大小写,所以entity!=entity。我建议你方将进口产品中entity的外壳改为entity。这可以解决你的问题。