我应该如何处理“ImportError:无法导入名称 X”或“AttributeError:...(很可能是由于循环导入)”?
- 2024-11-29 08:41:00
- admin 原创
- 161
问题描述:
我有一些代码分布在多个文件中,这些文件试图import
相互关联,如下所示:
主要文件:
from entity import Ent
实体.py:
from physics import Physics
class Ent:
...
物理.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
我认为该错误是由于entity
两次导入造成的 - 一次导入main.py
,一次导入physics.py
- 但我该如何解决这个问题呢?
另请参阅在 Python 中使用相互或循环(循环)导入时会发生什么?以大致了解允许的内容以及导致循环导入问题的原因。请参阅为什么循环导入似乎在调用堆栈的上层工作,但随后在下层引发 ImportError?以了解有关问题发生的原因和方式的技术细节。
解决方案 1:
您有循环依赖导入。在类定义之前physics.py
从中导入,并尝试导入已初始化的。从模块中删除依赖。entity
`Entphysics
entityphysics
entity`
解决方案 2:
虽然您绝对应该避免循环依赖,但您可以在 python 中推迟导入。
例如:
import SomeModule
def someFunction(arg):
from some.dependency import DependentClass
这(至少在某些情况下)将避免错误。
解决方案 3:
这是一个循环依赖。无需对代码进行任何结构性修改即可解决。出现此问题的原因是,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 = x.y
)。访问模块内容的静态或类变量也会导致问题。
解决方案 4:
就我而言,我正在使用 Jupyter 笔记本工作,发生这种情况是因为当我在工作文件中定义类/函数时,导入已经被缓存。
我重新启动了 Jupyter 内核并且错误消失了。
解决方案 5:
逻辑清晰很重要,出现这个问题是因为引用变成了死循环。
如果你不想改变逻辑,你可以把导致 ImportError 的一些导入语句放到文件的其他位置,例如末尾。
蟲
=
from test.b import b2
def a1():
print('a1')
b2()
py
from test.a import a1
def b1():
print('b1')
a1()
def b2():
print('b2')
if __name__ == '__main__':
b1()
您将收到导入错误:
ImportError: cannot import name 'a1'
但是如果我们改变 A 中 from test.b import b2 的位置,如下所示:
蟲
=
def a1():
print('a1')
b2()
from test.b import b2
然后我们就能得到我们想要的:
b1
a1
b2
解决方案 6:
这是一个循环依赖。我们可以通过在需要的地方使用导入模块、类或函数来解决这个问题。如果我们使用这种方法,我们就可以修复循环依赖。
蟠尾藻
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()
解决方案 7:
我刚刚也遇到了这个错误,原因不同......
from my_sub_module import my_function
主脚本有 Windows 行尾。my_sub_module
有 UNIX 行尾。将它们更改为相同即可解决问题。它们还需要具有相同的字符编码。
解决方案 8:
问题很明显:和模块之间名称的循环依赖。entity
`physics`
无论导入整个模块还是仅导入一个类,都必须加载名称。
看这个例子:
# a.py
import b
def foo():
pass
b.bar()
# b.py
import a
def bar():
pass
a.foo()
这将被编译成:
# a.py
# import b
# b.py
# import a # ignored, already importing
def bar():
pass
a.foo()
# name a.foo is not defined!!!
# import b done!
def foo():
pass
b.bar()
# done!
只需稍加改变,我们就能解决这个问题:
# a.py
def foo():
pass
import b
b.bar()
# b.py
def bar():
pass
import a
a.foo()
这将被编译成:
# a.py
def foo():
pass
# import b
# b.py
def bar():
pass
# import a # ignored, already importing
a.foo()
# import b done!
b.bar()
# done!
解决方案 9:
前面已经提到,这是由循环依赖引起的。还没有提到的是,当你使用 Python类型模块并且导入一个仅用于注释类型的类时,你可以使用前向引用:
当类型提示包含尚未定义的名称时,该定义可以表示为字符串文字,以便稍后解析。
并删除依赖项(导入),例如
from my_module import Tree
def func(arg: Tree):
# code
做:
def func(arg: 'Tree'):
# code
(请注意被删除的import
声明)
解决方案 10:
尝试这个解决方案:重命名你的工作 Python 脚本
您不应该使用您导入的其他模块的名称来命名您当前的 python 脚本,因为您会收到该错误。
例子:
你正在工作
medicaltorch.py
在该脚本中,您有:
from medicaltorch import X
其中medicaltorch
应该是一个单独安装的模块
这将失败,ImportError
因为有两件事涉及medicaltorch
因此,只需在 1 中重命名你的工作 Python 脚本即可。
解决方案 11:
如果您正在导入file1.py
并file2.py
使用以下内容:
if __name__ == '__main__':
# etc
下面的变量file1.py
无法导入,file2.py
因为__name__
不等于 __main__
!
如果您想从 导入某些内容file1.py
,file2.py
则需要在 中使用它file1.py
:
if __name__ == 'file1':
# etc
如有疑问,请作出assert
声明以确定__name__=='__main__'
解决方案 12:
暂时不要在这里看到这个 - 这非常愚蠢,但请确保您导入了正确的变量/函数。
我收到这个错误
ImportError:无法导入名称 IMPLICIT_WAIT
因为我的变量实际上是IMPLICIT_TIMEOUT
。
当我将导入更改为使用正确的名称时,我不再收到错误
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)