ImportError:没法导入名称X

我有四个不一样的文件,分别命名为: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


#1楼

虽然您绝对应该避免循环依赖,但能够推迟python中的导入。 orm

例如: ci

import SomeModule

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

这(至少在某些状况下)将避免该错误。 get


#2楼

这是循环依赖性。 无需对代码进行任何结构修改便可解决。 出现问题是由于在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 )。 访问模块内容的静态或类变量也会引发问题。


#3楼

我也刚收到这个错误,缘由有所不一样...

from my_sub_module import my_function

主脚本具备Windows行尾。 my_sub_module具备UNIX行结尾。 将它们更改成相同可解决此问题。 它们还须要具备相同的字符编码。


#4楼

弄清楚逻辑很重要。 出现此问题,由于该引用成为死循环。

若是您不想更改逻辑,则能够将致使ImportError的某些import语句放在文件的其余位置,例如结尾。

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的位置,将b2导入A以下所示:

py

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

from test.b import b2

咱们能够获得咱们想要的:

b1
a1
b2

#5楼

不要使用您导入的其余模块的名称来命名当前的python脚本

解决方案: 重命名工做的python脚本

例:

  1. 您在medicaltorch.py工做
  2. 在该脚本中,您具备: from medicaltorch import datasets as mt_datasets ,其中medicaltorch应该是已安装的模块

这将因ImportError而失败。 只需在1中重命名工做的python脚本便可。

相关文章
相关标签/搜索