我有两个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有内置的方法来缓解它。
问题是,当你运行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的第一次执行就被注册为导入模块。
其他回答
问题在于模块之间的循环依赖关系。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的第一次执行就被注册为导入模块。
不知道如何,但下面的改变排序我的问题:
我的文件名和导入名称相同,例如我的文件名为emoji.py,我试图导入表情符号。但是改变文件名解决了这个问题。
希望能有所帮助
让我们通过例子来看看问题和解决方案,循环依赖关系是如何到达的。 我有一个文件窗口数据生成器。ipynb执行主文件导入如下两个文件。
escape.py MutationTypes.py
escape.py已经导入MutationTypes.py文件 现在,在窗口数据生成器中。我想执行MutationTypes.py的功能,如下所示:
import escape as ESC
import MutationTypes
MutationTypes.SINGLE_RES_SUB
错误提示为AttributeErrorTraceback(最近一次调用)/tmp/ipykernel_4340/4282764781.py在<module> ----> 1 MutationTypes中。属性错误:模块“MutationTypes”没有属性“SINGLE_RES_SUB”
如何解决这个问题? 因为您已经在转义模块中导入了MutationTypes文件,下面使用转义模块使用MutationTypes文件功能
ESC.MutationTypes.SINGLE_RES_SUB
在ubuntu 18.04 (virtualenv, python.3.6.x)上,下面的重载代码段为我解决了这个问题:
main.py
import my_module # my_module.py
from importlib import reload # reload
reload(my_module)
print(my_module)
print(my_modeule.hello())
地点:
|--main.py
|--my_module.py
查看更多文档:这里