2

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

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'

模块一:

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: No module named b

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

4

1 回答 1

2

正如评论中多次提到的,您正在设计您的项目以使用循环导入:

循环导入很好,两个模块都使用“import”形式的导入。当第二个模块想要从第一个模块中获取一个名称(“从模块导入名称”)并且导入位于顶层时,它们会失败。那是因为第一个模块中的名称尚不可用,因为第一个模块正忙于导入第二个模块。

如果您在每个模块的最顶部放置一个打印语句,您将看到正在发生的事情......

示例 a、b、c: print "inside aaa" # bbb, ccc

当你执行 modulea时,你会得到这个:

$ 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去 import b.py,但b需要a,所以它回到那个模块,在那里它看到了bbb导入的其余部分。好吧b,此时仅部分加载,因此b_method尚未定义。所以你会崩溃。

What you should do is avoid having your modules import each other in circles. There should be a set of common modules for which others all import the shared functionality. But as stated in the python faq, it can be worked around by only importing the module namespace (import bbb).

于 2012-11-26T00:06:27.877 回答