gpt4 book ai didi

python - 无法导入模块

转载 作者:行者123 更新时间:2023-11-28 22:58:54 25 4
gpt4 key购买 nike

首先,这很可能不是路径问题。

我在eclipse 中有一个pydev 项目。这是目录结构:

Genetic-Framework
| Genetic-Framework
| Genetic
| __init__.py
| GA.py
| crossover.py
| fitness.py
| individual.py
| mutation.py
| population.py
| selection.py
| settings.py
| visualization.py

GA.py 中,我有以下行:

from Genetic import settings, selection, visualization as vis

是的,Geneticsys.path 中。但是,我收到以下错误:

  File "/.../Genetic-Framework/Genetic-Framework/Genetic/GA.py", line 17, in <module>
from Genetic import settings, selection, visualization as vis
ImportError: cannot import name settings

但是,当我从该行中删除 settings 时,其他所有内容都可以正常导入。

有趣的是,settings.py 的第一行是这样的:

from Genetic import fitness, selection, mutation, crossover, population, GA

当我从该行中删除 GA 时,一切似乎都正常导入。

为什么会出现此错误?这是循环进口的一些问题吗?我该如何解决这个问题?

最佳答案

是的,这是循环导入的问题。

问题

问题是当您的 GA.py 运行时,它首先尝试导入 settings。这意味着 settings.py 开始运行,并立即尝试导入 GA

但是,GA 已经在加载过程中,因此 GA.py 不会再次运行 - 相反,settings 只加载已经在内存中的 GA(目前大部分是空的,因为它仍在执行导入)。

因此,settings 中尝试使用 GA 之外的东西的东西失败了,因为他们在 GA haven 中寻找的东西尚未定义(因为 GA.py 的处理尚未通过导入)。

这使得 settings.py 的评估引发异常,表现为导入失败(因为导入过程中引发的异常导致导入失败)。

解决方案

a) 首先避免这种情况。

一般来说,您应该首先尝试避免循环导入。它们通常意味着你有非常奇怪的依赖结构,以后很难调试。

一种方法是尝试找到两个模块都需要的东西,并将它们分解成一个单独的第三个模块,可以在其他两个模块之间共享 - 所以不要在 B 中使用 A.x,在 A 中使用 B.y ,您改为在 A 和 B 中使用 C.x 和 C.y。

b) 在加载所有内容之前,不要真正尝试使用循环导入中的内容。

您可以做的另一件事是推迟使用另一个模块中的某些内容,直到所有导入完成之后。换句话说,不要尝试从顶层代码引用导入模块的内容,而是将其放在类初始值设定项或函数中,以便在所有导入完成后稍后调用。

例如,而不是这个...

import Foo

class Baz:
top_level_variable = Foo.bar

你可以这样做:

import Foo

class Baz:
def __init__(self):
self.instance_variable = Foo.bar

显然,实例属性与类属性略有不同,但其想法是推迟实际必须从其他模块查找内容,直到所有模块完成执行并因此可以使用它们的内容。另请注意,from Foo import bar 在这里会失败,因为它会在导入时尝试访问 Foo 的内容,这是需要避免的。

关于python - 无法导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13444900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com