【发布时间】:2012-06-17 05:27:14
【问题描述】:
我有一个这样的包
package/
__init__.py
subpackage1/
__init__.py
moduleA.py
moduleB.py
moduleC.py
moduleD.py
subpackage2/
__init__.py
moduleX.py
moduleY.py
moduleZ.py
在moduleB.py中,我正在导入
from moduleA import bar
在moduleA中,我正在导入
from moduleB import foo
我收到 ImportError。
ImportError: cannot import name foo
这可能是什么问题?为了避免这个问题,我该怎么办?我应该在 _init_.py pf package, subpackage1, subpackage2 中写什么?
_init_子包1的.py
from moduleA import *
from moduleB import *
from moudleC import *
from moudleD import *
_init_子包2的.py
from moduleX import *
from moduleY import *
from moduleZ import *
_init_包的.py
from subpackage1 import *
from subpackage2 import *
我的 _init_.py 文件有问题吗?
编辑: 我改变了进口
模块B
from .moduleA import bar
模块A
from .moduleB import foo
不过,我还是遇到了同样的导入错误。
ImportError: cannot import name foo
编辑:
模块B
def Bar():
def __init__(self):
self.foo = Foo()
self.val = 10
.
.
模块A
def Foo():
def __init__(self):
self.bar = Bar()
self.val = 5
.
.
我想这样做。而且我坚持将这两个类保存在不同的文件中。我应该如何导入?
【问题讨论】:
-
我想你的意思是 Foo 类和 Bar 类?无论哪种方式,我都会在我的回答中展示一些如何做到这一点的例子。 ModuleB 或 ModuleA 中只有一个必须遵循我展示的模式之一,另一个仍然可以在顶部执行。还有其他问题吗?
-
谢谢。它正在工作。但我得到了 RuntimeError: maximum recursion depth exceeded。我从 Foo 的 Bar 和 Bar 给 Foo 打电话。我会调查的。
-
不客气。听起来您在那里进行了一些无限递归,如果您在每次初始化它们时都创建另一个新的递归,这是可以预料的。你需要重新考虑你的设计。也许你可以在实例化 Bar() 时从 Foo() 中传入一个引用。这样,bar 就有了 foo。例如。在 Bar: (__init__(self, foo): self.foo = foo) 和在 Foo: (__init__(self): self.bar = Bar(self))
标签: python hierarchy importerror