我有四个不一样的文件,分别命名为:main,vector,entity和physics。 我不会发布全部代码,而只会发布导入代码,由于我认为这就是错误所在。 (若是须要,我能够发布更多信息) python
主要: 函数
import time from entity import Ent from vector import Vect #the rest just creates an entity and prints the result of movement
实体: this
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
物理: spa
from entity import Ent class Physics: #physics class gets an entity and does physics calculations on it.
而后,我从main.py运行,出现如下错误: rest
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 ++了很长时间。 我猜想该错误是因为两次导入实体引发的,一次是在实体中,一次是在物理学中,可是我不知道解决方法。 有人能够帮忙吗? code
虽然您绝对应该避免循环依赖,但能够推迟python中的导入。 orm
例如: ci
import SomeModule def someFunction(arg): from some.dependency import DependentClass
这(至少在某些状况下)将避免该错误。 get
这是循环依赖性。 无需对代码进行任何结构修改便可解决。 出现问题是由于在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 = xy
)。 访问模块内容的静态或类变量也会引发问题。
我也刚收到这个错误,缘由有所不一样...
from my_sub_module import my_function
主脚本具备Windows行尾。 my_sub_module
具备UNIX行结尾。 将它们更改成相同可解决此问题。 它们还须要具备相同的字符编码。
弄清楚逻辑很重要。 出现此问题,由于该引用成为死循环。
若是您不想更改逻辑,则能够将致使ImportError的某些import语句放在文件的其余位置,例如结尾。
from test.b import b2 def a1(): print('a1') b2()
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的位置,将b2导入A以下所示:
def a1(): print('a1') b2() from test.b import b2
咱们能够获得咱们想要的:
b1 a1 b2
不要使用您导入的其余模块的名称来命名当前的python脚本
解决方案: 重命名工做的python脚本
例:
medicaltorch.py
工做 from medicaltorch import datasets as mt_datasets
,其中medicaltorch
应该是已安装的模块 这将因ImportError
而失败。 只需在1中重命名工做的python脚本便可。