我有两个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模块:
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中有相互导入,方法是在函数中导入它们:
# In b.py:
def cause_a_to_do_something():
import a
a.do_something()
现在a.py可以安全地导入b而不会产生问题。
(乍一看,cause_a_to_do_something()似乎效率非常低,因为每次调用它时它都会导入,但实际上导入工作只在第一次执行。第二次和以后导入一个模块时,这是一个快速操作。)
其他回答
问题在于模块之间的循环依赖关系。a导入b, b导入a。但其中一个需要先加载——在这种情况下,python最终会在b之前初始化模块a,而当你试图在a中访问它时,b.hi()还不存在。
循环导入会导致问题,但Python有内置的方法来缓解它。
问题是,当你运行python a.py时,它运行a.py,但没有将其标记为导入模块。因此依次a.py ->导入模块b ->导入模块a ->导入模块b。最后一次导入是无操作的,因为b目前正在导入,Python会防止这种情况发生。b现在是一个空模块。所以当它执行b.hi()时,它找不到任何东西。
注意,执行的b.hi()是在a.py ->模块b ->模块a期间,而不是直接在a.py中。
在你的特定示例中,你可以在顶层运行python -c 'import a',这样a.py的第一次执行就被注册为导入模块。
对我来说,这个错误的原因是有一个文件夹与我试图导入的python模块同名。
|-- core <-- empty directory on the same level as the module that throws the error
|-- core.py
python将该文件夹视为python包,并试图从空包“core”导入,而不是从core.py导入。
似乎出于某种原因,git在切换分支时留下了空文件夹
所以我移除了那个文件夹,一切都很顺利
不知道如何,但下面的改变排序我的问题:
我的文件名和导入名称相同,例如我的文件名为emoji.py,我试图导入表情符号。但是改变文件名解决了这个问题。
希望能有所帮助
导入的顺序是我遇到问题的原因:
a.py:
############
# this is a problem
# move this to below
#############
from b import NewThing
class ProblemThing(object):
pass
class A(object):
###############
# add it here
# from b import NewThing
###############
nt = NewThing()
pass
b.py:
from a import ProblemThing
class NewThing(ProblemThing):
pass
这只是另一个例子,类似于richieindie的答案,但是有类。