我有两个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模块同名。

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

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

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

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

其他回答

在某些情况下,可能只是文件保存在正确的目录中,但在虚拟环境中写入文件时,文件中写入的python还没有保存。因此,当python将a.py导入到b.py时,不会导入任何代码。在其他方面是空白的。这似乎是我经常看到的一个容易识别的错误。值得一查。 科迪

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

你可以通过添加2个print来理解:

a.py:

print(__name__)
import b

b.py:

print(__name__)
import a

然后:

$ python3 a.py
__main__
b
a

a.py最终会被加载/执行2次。一个作为__main__,一个作为a。

让我们通过例子来看看问题和解决方案,循环依赖关系是如何到达的。 我有一个文件窗口数据生成器。ipynb执行主文件导入如下两个文件。

escape.py MutationTypes.py

escape.py已经导入MutationTypes.py文件 现在,在窗口数据生成器中。我想执行MutationTypes.py的功能,如下所示:

import escape as ESC
import MutationTypes
MutationTypes.SINGLE_RES_SUB 

错误提示为AttributeErrorTraceback(最近一次调用)/tmp/ipykernel_4340/4282764781.py在<module> ----> 1 MutationTypes中。属性错误:模块“MutationTypes”没有属性“SINGLE_RES_SUB”

如何解决这个问题? 因为您已经在转义模块中导入了MutationTypes文件,下面使用转义模块使用MutationTypes文件功能

ESC.MutationTypes.SINGLE_RES_SUB

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

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

正确的导入:

from package.MyEnumClass import MyEnumClass

希望这能帮助到别人