我有一些代码分布在多个文件中,试图从彼此导入,如下所示:

main.py:

from entity import Ent

entity.py:

from physics import Physics
class Ent:
    ...

physics.py:

from entity import Ent
class Physics:
    ...

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

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

我假设错误是由于导入实体两次-一次在main.py和物理。py -但我如何解决这个问题?


参见在Python中使用相互导入或循环(循环)导入时会发生什么?了解WRT循环导入所允许的内容以及导致问题的原因。参见为什么循环导入看起来在调用堆栈中更上一层,但随后在更下一层引发ImportError ?有关问题发生的原因和方式的技术细节。


当前回答

在我的例子中,我在一个Jupyter笔记本上工作,这是因为当我在工作文件中定义类/函数时,导入已经被缓存了。

我重新启动了Jupyter内核,错误消失了。

其他回答

我也遇到过这个错误,但我的情况不太常见,它也抛出这个错误。

我的案例是,我在jupyter笔记本上遇到了这个错误;我从M导入c,其中M是一个python文件,c是M.py中的一个类,出现错误的原因是因为c是几分钟前刚刚创建的,但我的jupyter笔记本已经运行了很长时间,所以我只需要重新启动jupyter笔记本,让它重新加载M.py。

在我的例子中,只是错过了文件名:

from A.B.C import func_a (x)

from A.B.C.D import func_a (O)

其中D为file。

这是一个循环依赖。 我们可以在需要的地方使用import模块或类或函数来解决这个问题。 如果我们使用这种方法,就可以修复循环依赖关系

A.py

from B import b2
def a1():
    print('a1')
    b2()

B.py

def b1():
   from A import a1
   print('b1')
   a1()

def b2():
   print('b2')
if __name__ == '__main__':
   b1() 

在我的例子中,我在一个Jupyter笔记本上工作,这是因为当我在工作文件中定义类/函数时,导入已经被缓存了。

我重新启动了Jupyter内核,错误消失了。

不是专门针对这个请求器的,但是如果导入的类名与导入的文件中的定义不匹配,同样的错误会显示出来。