我有两个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'

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


当前回答

不知道如何,但下面的改变排序我的问题:

我的文件名和导入名称相同,例如我的文件名为emoji.py,我试图导入表情符号。但是改变文件名解决了这个问题。

希望能有所帮助

其他回答

我遇到这个错误是因为实际上没有导入模块。代码是这样的:

import a.b, a.c

# ...

something(a.b)
something(a.c)
something(a.d)  # My addition, which failed.

最后一行导致一个AttributeError。原因是我没有注意到a的子模块(a.b和a.c)被显式导入,并假设import语句实际上导入了a。

解决了

Python正在你的a.py模块中寻找a对象。

将该文件重命名为其他文件或使用

from __future__ import absolute_import 

在a.py模块的顶部。

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

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

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

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

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

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

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