我有两个python模块:

a.py

import b

def hello():
  print "hello"

print "a.py"
print hello()
print b.hi()

b.py

import a

def hi():
  print "hi"

当我运行a.py时,我得到:

AttributeError: 'module' object has no attribute 'hi'

这个误差是什么意思?我该怎么解决呢?


当前回答

问题在于模块之间的循环依赖关系。a导入b, b导入a。但其中一个需要先加载——在这种情况下,python最终会在b之前初始化模块a,而当你试图在a中访问它时,b.hi()还不存在。

其他回答

我还曾在无意中将一个模块命名为标准Python模块时遇到过这种错误。例如,我有一个名为commands的模块,它也是一个Python库模块。这被证明很难追踪,因为它在我的本地开发环境中正确工作,但在谷歌应用程序引擎上运行时失败了。

我通过引用一个以错误方式导入的enum得到了这个错误,例如:

from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member

正确的导入:

from package.MyEnumClass import MyEnumClass

希望这能帮助到别人

您有相互的顶级导入,这几乎总是一个坏主意。

如果你真的必须在Python中有相互导入,方法是在函数中导入它们:

# In b.py:
def cause_a_to_do_something():
    import a
    a.do_something()

现在a.py可以安全地导入b而不会产生问题。

(乍一看,cause_a_to_do_something()似乎效率非常低,因为每次调用它时它都会导入,但实际上导入工作只在第一次执行。第二次和以后导入一个模块时,这是一个快速操作。)

你存了'b.py'吗? 你必须先保存'b.py'。

对我来说,这个错误的原因是有一个文件夹与我试图导入的python模块同名。

|-- core  <-- empty directory on the same level as the module that throws the error
|-- core.py

python将该文件夹视为python包,并试图从空包“core”导入,而不是从core.py导入。

似乎出于某种原因,git在切换分支时留下了空文件夹

所以我移除了那个文件夹,一切都很顺利