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