AttributeError:'module'对象没有属性

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

错误是什么意思?我如何解决它?

回答(8)

2 years ago

你有共同的顶级导入,这几乎总是一个坏主意 .

如果你真的必须在Python中进行相互导入,那么这样做的方法是在函数中导入它们:

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

现在a.py可以安全地做 import b 而不会引起问题 .

(乍一看,似乎 cause_a_to_do_something() 的效率非常低,因为每次调用它都会产生 import ,但事实上导入工作只是第一次完成 . 第二次和以后你导入一个模块,它很快操作) .

2 years ago

当无意中命名一个与标准Python模块之一同名的模块时,我也看到了这个错误 . 例如 . 我有一个名为 commands 的模块,它也是一个Python库模块 . 这被证明很难跟踪,因为它在我的本地开发环境中正常工作,但在Google App Engine上运行时因指定的错误而失败 .

2 years ago

问题是模块之间的循环依赖性 . a 进口 bb 进口 a . 但是其中一个需要首先加载 - 在这种情况下,python最终在 b 之前初始化模块 a 并且当你尝试在 a 中访问它时 b.hi() 不存在 .

2 years ago

我通过引用以错误方式导入的枚举来获得此错误,例如:

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

正确导入:

from package.MyEnumClass import MyEnumClass

希望能帮助别人

2 years ago

我遇到此错误,因为模块实际上并未导入 . 代码看起来像这样:

import a.b, a.c

# ...

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

最后一行产生了 AttributeError . 原因是我没有注意到 aa.ba.c )的子模块被显式导入,并假设 import 语句实际导入了 a .

2 years ago

以上所有答案都很棒,但我想在这里说一声 . 如果您没有发现上述任何问题,请尝试清理您的工作环境 . 它对我有用 .

2 years ago

当我从git检出旧版本的存储库时遇到了这个问题 . Git替换了我的 .py 文件,但留下了未经跟踪的 .pyc 文件 . 由于 .py 文件和 .pyc 文件不同步, .py 文件中的 import 命令无法在 .pyc 文件中找到相应的模块 .

解决方案只是删除 .pyc 文件,并让它们自动重新生成 .

2 years ago

不确定如何,但以下更改排序了我的问题:

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

希望如此有帮助