python如何调试此ImportError No模块

时间:2012-11-25 23:48:11

标签: python

我在从特定模块导入时遇到问题,但一般不从模块导入。我的项目结构:

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

的模块

我可以在哪里找到解决问题的线索?

1 个答案:

答案 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)来解决。