Python 导入错误:无法导入名称X

Python 导入错误:无法导入名称X,python,python-import,importerror,circular-dependency,Python,Python Import,Importerror,Circular Dependency,我有四个不同的文件名:main.py、vector.py、entity.py和physics.py。我不会发布所有代码,只发布导入,因为我认为这就是错误所在(如果您愿意,我可以发布更多) main.py: import time from entity import Ent from vector import Vect #the rest just creates an entity and prints the result of movement entity.py: from vect

我有四个不同的文件名:
main.py
vector.py
entity.py
physics.py
。我不会发布所有代码,只发布导入,因为我认为这就是错误所在(如果您愿意,我可以发布更多)

main.py:

import time
from entity import Ent
from vector import Vect
#the rest just creates an entity and prints the result of movement
entity.py:

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
vector.py:

from math import *
class Vect:
    #holds i, j, k, and does vector math
physics.py:

from entity import Ent
class Physics:
    #physics class gets an entity and does physics calculations on it.
然后从
main.py
运行,得到以下错误:

回溯(最近一次呼叫最后一次):
文件“main.py”,第2行,在
从实体导入
文件“../entity.py”,第5行,在
从物理学到物理学
文件“../physics.py”,第2行,在
从实体导入
ImportError:无法导入名称Ent

我猜这个错误是由于导入实体两次造成的,一次是在
main.py
中,后来是在
physics.py
中,但我不知道解决方法。有人能帮忙吗?

您有循环相关导入<代码>物理.py在定义类
Ent
之前从
实体
导入,并且
物理
尝试导入已初始化的
实体
。从
实体
模块中删除对
物理
的依赖关系。

当然应该避免循环依赖关系,但可以在python中延迟导入

例如:

import SomeModule

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

这(至少在某些情况下)可以避免错误。

这是一种循环依赖关系。不需要对代码进行任何结构修改即可解决此问题。出现此问题的原因是,在
向量
中,您要求
实体
立即可用,反之亦然。出现此问题的原因是,您要求在模块准备就绪之前访问模块的内容——使用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
)。访问模块内容的静态变量或类变量也会导致问题。

我也刚刚收到这个错误,原因不同

from my_sub_module import my_function
主脚本有Windows行结尾<代码>我的子模块有UNIX行结尾。将它们更改为相同的解决了问题。它们还需要具有相同的字符编码

把逻辑弄清楚是很重要的。这个问题出现了,因为引用变成了一个死循环

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

a、 派克 b、 派克 您将收到导入错误:
ImportError:无法导入名称“a1”

但是如果我们改变了从test.b导入b2的位置,如下所示:

a、 派克 我们可以得到我们想要的:

b1
a1
b2

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

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

例如:

  • 您正在
    medicaltorch.py中工作
  • 在该脚本中,您有:
    从medicaltorch导入数据集作为mt_数据集
    ,其中
    medicaltorch
    应该是一个已安装的模块

  • 这将因导入错误而失败。只需在1中重命名您正在工作的python脚本。

    这里还没有看到这个脚本-这非常愚蠢,但请确保您导入了正确的变量/函数

    我犯了这个错误

    ImportError:无法导入名称隐式\u等待

    因为我的变量实际上是
    隐式超时


    当我将导入更改为使用正确的名称时,我不再收到错误这是一个循环依赖项。 我们可以在需要的地方使用导入模块或类或函数来解决这个问题。 如果我们使用这种方法,我们可以修复循环依赖

    A.py

    from B import b2
    def a1():
        print('a1')
        b2()
    
    def b1():
       from A import a1
       print('b1')
       a1()
    
    def b2():
       print('b2')
    if __name__ == '__main__':
       b1() 
    
    B.py

    from B import b2
    def a1():
        print('a1')
        b2()
    
    def b1():
       from A import a1
       print('b1')
       a1()
    
    def b2():
       print('b2')
    if __name__ == '__main__':
       b1() 
    

    不是专门针对此询问者的,但是如果导入中的类名与导入源文件中的定义不匹配,则会显示相同的错误。

    跟踪导入错误的一种方法是逐步尝试在每个导入的文件上运行python,以跟踪坏的文件

  • 你会得到这样的结果:

    python ./main.py
    
    ImportError:无法导入名称

  • 然后启动:

    python ./modules/a.py
    
    python ./modules/b.py
    
    导入错误:无法导入名称B

  • 然后启动:

    python ./modules/a.py
    
    python ./modules/b.py
    
    ImportError:无法导入名称C(某些不存在的模块或其他错误)


  • 与OP也没有直接关系,但在向模块添加新对象后,未能重新启动PyCharm Python控制台也是一个很好的方法,可以得到一个非常混乱的
    ImportError:Cannot import name…


    令人困惑的是,PyCharm将在控制台中自动完成导入,但导入失败。

    如果您从
    file2.py
    导入
    file1.py
    ,并使用以下方法:

    如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
    #等
    
    无法将
    file1.py
    中低于该值的变量导入
    file2.py
    ,因为
    \uu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu不等于
    \uuuuuuuuu

    如果要将某些内容从
    file1.py
    导入
    file2.py
    ,则需要在
    file1.py
    中使用此选项:

    if __name__ == 'file1':
        # etc
    
    如有疑问,请做出
    assert
    声明以确定
    from my_module import Tree
    
    def func(arg: Tree):
        # code
    
    def func(arg: 'Tree'):
        # code