我有两个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还没有保存。因此,当python将a.py导入到b.py时,不会导入任何代码。在其他方面是空白的。这似乎是我经常看到的一个容易识别的错误。值得一查。 科迪
其他回答
我通过引用一个以错误方式导入的enum得到了这个错误,例如:
from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member
正确的导入:
from package.MyEnumClass import MyEnumClass
希望这能帮助到别人
当我从git中签出一个旧版本的存储库时,我遇到了这个问题。Git替换了我的.py文件,但留下了未跟踪的.pyc文件。由于.py文件和.pyc文件不同步,.py文件中的导入命令无法在.pyc文件中找到相应的模块。
解决方案就是删除.pyc文件,并让它们自动重新生成。
循环导入会导致问题,但Python有内置的方法来缓解它。
问题是,当你运行python a.py时,它运行a.py,但没有将其标记为导入模块。因此依次a.py ->导入模块b ->导入模块a ->导入模块b。最后一次导入是无操作的,因为b目前正在导入,Python会防止这种情况发生。b现在是一个空模块。所以当它执行b.hi()时,它找不到任何东西。
注意,执行的b.hi()是在a.py ->模块b ->模块a期间,而不是直接在a.py中。
在你的特定示例中,你可以在顶层运行python -c 'import a',这样a.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。
问题在于模块之间的循环依赖关系。a导入b, b导入a。但其中一个需要先加载——在这种情况下,python最终会在b之前初始化模块a,而当你试图在a中访问它时,b.hi()还不存在。