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++工作了很长时间。我猜这个错误是由于两次导入实体造成的,一次导入主体,后来导入物理,但我不知道如何解决这个问题。有人能帮忙吗?
您有循环依赖导入。
虽然您绝对应该避免循环依赖关系,但可以在Python中延迟导入。
例如:
1 2 3 4 | import SomeModule def someFunction(arg): from some.dependency import DependentClass |
这(至少在某些情况下)将规避错误。
这是循环依赖关系。它不需要对代码进行任何结构修改就可以解决。问题的出现是因为在
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能够处理循环依赖项,您必须只使用
1 2 3 4 | import x class cls: def __init__(self): self.y = x.y |
由于不再在顶层引用模块的内容,所以Python可以编译模块,而实际上不必访问循环依赖项的内容。在顶层,我指的是将在编译期间执行的行,而不是函数的内容(如
To make logic clear is very important. This problem appear, because the reference become a dead loop.
如果不想更改逻辑,可以将导致importError的某些import语句放在文件的另一个位置,例如end。
A.Py1 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.Py1 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行结尾。
不要用导入的其他模块的名称命名当前的python脚本
解决方案:重命名正在运行的python脚本
例子:
这将在
在这里还没有看到这个-这是非常愚蠢的,但是要确保导入的是正确的变量/函数。
我得到这个错误
ImportError: cannot import name IMPLICIT_WAIT
因为我的变量实际上是
当我更改导入以使用正确的名称时,我不再收到错误?????
python区分大小写,所以