我有两个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'
这个误差是什么意思?我该怎么解决呢?
我有两个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'
这个误差是什么意思?我该怎么解决呢?
当前回答
您有相互的顶级导入,这几乎总是一个坏主意。
如果你真的必须在Python中有相互导入,方法是在函数中导入它们:
# In b.py:
def cause_a_to_do_something():
import a
a.do_something()
现在a.py可以安全地导入b而不会产生问题。
(乍一看,cause_a_to_do_something()似乎效率非常低,因为每次调用它时它都会导入,但实际上导入工作只在第一次执行。第二次和以后导入一个模块时,这是一个快速操作。)
其他回答
我还曾在无意中将一个模块命名为标准Python模块时遇到过这种错误。例如,我有一个名为commands的模块,它也是一个Python库模块。这被证明很难追踪,因为它在我的本地开发环境中正确工作,但在谷歌应用程序引擎上运行时失败了。
我通过引用一个以错误方式导入的enum得到了这个错误,例如:
from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member
正确的导入:
from package.MyEnumClass import MyEnumClass
希望这能帮助到别人
我遇到这个错误是因为实际上没有导入模块。代码是这样的:
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。
我也遇到过同样的问题。 使用重载修复。
import the_module_name
from importlib import reload
reload(the_module_name)
解决了
Python正在你的a.py模块中寻找a对象。
将该文件重命名为其他文件或使用
from __future__ import absolute_import
在a.py模块的顶部。