AttributeError:'module'对象没有属性

Ste*_*Hsu 178 python attributeerror

我有两个python模块:

a.py

import b

def hello():
  print "hello"

print "a.py"
print hello()
print b.hi()
Run Code Online (Sandbox Code Playgroud)

b.py

import a

def hi():
  print "hi"
Run Code Online (Sandbox Code Playgroud)

当我跑步时a.py,我得到:

AttributeError: 'module' object has no attribute 'hi'
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*dle 179

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

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

# In b.py:
def cause_a_to_do_something():
    import a
    a.do_something()
Run Code Online (Sandbox Code Playgroud)

现在a.py可以安全地做到import b而不会造成问题.

(乍一看,它可能看起来cause_a_to_do_something()非常低效,因为它import每次调用时都会执行,但实际上导入工作只在第一次完成.第二次和以后导入模块时,这是一个快速操作. )

  • 在我看来,这更像是一种解决方法,而不是解决方案。 (7认同)
  • @gst 基本上就像用 python 编写的所有内容一样? (5认同)

luc*_*ell 87

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


sth*_*sth 42

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


小智 20

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

from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member
Run Code Online (Sandbox Code Playgroud)

正确导入:

from package.MyEnumClass import MyEnumClass
Run Code Online (Sandbox Code Playgroud)

希望能帮助别人


Jiu*_*Jiu 9

我遇到了同样的问题。使用reload.

import the_module_name
from importlib import reload
reload(the_module_name)
Run Code Online (Sandbox Code Playgroud)


Dag*_*ahl 7

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

import a.b, a.c

# ...

something(a.b)
something(a.c)
something(a.d)  # My addition, which failed.
Run Code Online (Sandbox Code Playgroud)

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


cra*_*raq 6

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

解决办法很简单,就是删除.pyc文件,让它们自动重新生成。


小智 5

以上所有答案都很好,但我想在这里插话。如果您没有发现上述任何问题,请尝试清理您的工作环境。这对我有用。


Beh*_*ari 5

ubuntu 18.04virtualenvpython.3.6.x)上,以下重新加载片段为我解决了这个问题:

主文件

import my_module  # my_module.py
from importlib import reload # reload 
reload(my_module)

print(my_module)
print(my_modeule.hello())
Run Code Online (Sandbox Code Playgroud)

在哪里:

|--main.py    
|--my_module.py
Run Code Online (Sandbox Code Playgroud)

更多文档检查:这里