首页 文章

AttributeError:'module' object没有属性

提问于
浏览
142

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

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

  • 73

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

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

    正确导入:

    from package.MyEnumClass import MyEnumClass
    

    希望能帮助别人

  • 2

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

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

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

  • 151

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

  • 7

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

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

    希望如此有帮助

  • 0

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

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

  • 16

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

    如果你真的必须在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 ,但事实上导入工作只是第一次完成 . 第二次和以后你导入模块,它很快操作) .

  • 38

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

相关问题