失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > java 无法import_ImportError:无法导入名称X

java 无法import_ImportError:无法导入名称X

时间:2023-08-27 15:55:06

相关推荐

java 无法import_ImportError:无法导入名称X

我有四个不同的文件,分别命名为:main,vector,entity和physics。 我不会发布所有代码,而只会发布导入代码,因为我认为这就是错误所在。 (如果需要,我可以发布更多信息)

主要:

import time

from entity import Ent

from vector import Vect

#the rest just creates an entity and prints the result of movement

实体:

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

物理:

from entity import Ent

class Physics:

#physics class gets an entity and does physics calculations on it.

然后,我从main.py运行,出现以下错误:

Traceback (most recent call last): File "main.py", line 2, in from entity import Ent File ".../entity.py", line 5, in from physics import Physics File ".../physics.py", line 2, in from entity import Ent ImportError: cannot import name Ent

我对Python非常陌生,但是已经使用C ++了很长时间。 我猜测该错误是由于两次导入实体引起的,一次是在实体中,一次是在物理学中,但是我不知道解决方法。 有人可以帮忙吗?

#1楼

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

例如:

import SomeModule

def someFunction(arg):

from some.dependency import DependentClass

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

#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脚本

例:

您在medicaltorch.py工作

在该脚本中,您具有: from medicaltorch import datasets as mt_datasets ,其中medicaltorch应该是已安装的模块

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

如果觉得《java 无法import_ImportError:无法导入名称X》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。