我在从特定模块导入时遇到问题,但一般不从模块导入。我的项目结构:
project-folder
aaa-folder
__init__.py
a.py
bbb-folder
__init__.py
b.py
ccc-folder
__init__.py
c.py
所有 init .py文件都是空白的。项目文件夹位于我的sys.path。
模块b:
from aaa.a import a_method
from ccc.c import c_method
def b_method(): print 'bye'
print 'hi'
模块c:
from aaa.a import a_method
from bbb.b import b_method
def c_method(): print 'bye'
print 'hi'
模块a:
from bbb.b import b_method
from ccc.c import c_method
def a_method(): print 'bye'
print 'hi'
我可以从python shell导入每个方法。模块b和c都从命令行运行,只需返回'hi'。当我运行模块a时,我得到ImportError:没有名为b
的模块我可以在哪里找到解决问题的线索?
答案 0 :(得分:2)
正如评论中提到的那样,您正在设计项目以使用循环导入:
循环导入很好,两个模块都使用“导入” 进口形式。当第二个模块想要取出一个名字时,它们会失败 第一个(“来自模块导入名称”),导入位于顶部 水平。那是因为第一个名字还没有,因为 第一个模块忙于导入第二个模块。
如果您在每个模块的最顶部放置一个打印声明,您将看到正在发生的事情......
示例a,b,c:print "inside aaa" # bbb, ccc
当你执行模块a
时,你会得到这个:
$ python aaa/a.py
inside aaa
inside bbb
inside aaa
Traceback (most recent call last):
File "aaa/a.py", line 2, in <module>
from bbb.b import b_method
File "/Users/user/Desktop/project/bbb/b.py", line 2, in <module>
from aaa.a import a_method
File "/Users/user/Desktop/project/aaa/a.py", line 2, in <module>
from bbb.b import b_method
ImportError: cannot import name b_method
a.py
用于导入b.py
,但b
需要a
,因此它会返回到该模块,在那里它会看到bbb
的其余部分进口。好b
此时仅部分加载,因此尚未定义b_method
。所以你会崩溃。
您应该做的是避免让您的模块以圆圈形式互相导入。应该有一组通用模块,其他人都可以导入共享功能。但正如python faq中所述,它可以通过仅导入模块命名空间(import bbb
)来解决。