首先,这很可能不是路径问题。
我在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是的,Genetic在sys.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时,一切似乎都导入得很好。
为什么我会得到这个错误?这是循环导入的问题吗?我该如何解决这个问题呢?
发布于 2012-11-19 05:46:20
是的,这是循环导入的一个问题。
问题所在
问题是,当您的GA.py运行时,它首先尝试导入settings。这意味着settings.py开始运行,并立即尝试导入GA。
但是,GA已经在加载过程中,所以GA.py不会第二次运行-相反,settings只加载已经在内存中的GA (内存目前大部分是空的,因为它仍在执行导入)。
因此,在settings中尝试使用GA之外的东西会失败,因为它们在GA中寻找的东西还没有定义(因为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的内容,这是需要避免的。
https://stackoverflow.com/questions/13444900
复制相似问题