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
每次调用时都会执行,但实际上导入工作只在第一次完成.第二次和以后导入模块时,这是一个快速操作. )
luc*_*ell 87
当无意中命名一个与标准Python模块之一同名的模块时,我也看到了这个错误.例如,我有一个名为的模块commands
,它也是一个Python库模块.这被证明很难跟踪,因为它在我的本地开发环境中正常工作,但在Google App Engine上运行时因指定的错误而失败.
小智 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)
希望能帮助别人
我遇到了同样的问题。使用reload
.
import the_module_name
from importlib import reload
reload(the_module_name)
Run Code Online (Sandbox Code Playgroud)
我遇到此错误,因为模块实际上并未导入.代码看起来像这样:
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.b
和a.c
)的子模块被显式导入,并假设该import
语句实际导入a
.
当我从 git 检出旧版本的存储库时遇到了这个问题。Git 替换了我的.py
文件,但留下了未跟踪的.pyc
文件。由于.py
文件和.pyc
文件不同步,文件中的import
命令在.py
文件中找不到对应的模块.pyc
。
解决办法很简单,就是删除.pyc
文件,让它们自动重新生成。
在ubuntu 18.04(virtualenv,python.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)
更多文档检查:这里
归档时间: |
|
查看次数: |
547763 次 |
最近记录: |