我有两个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'
错误是什么意思?我如何解决它?
问题是模块之间的循环依赖性 . a 进口 b 和 b 进口 a . 但是其中一个需要先加载 - 在这种情况下,当你试图在 a 中访问它时,python最终会在 b 之前初始化模块 a 并且 b.hi() 不存在 .
a
b
b.hi()
我通过引用以错误方式导入的枚举来获得此错误,例如:
from package import MyEnumClass # ... # in some method: return MyEnumClass.Member
正确导入:
from package.MyEnumClass import MyEnumClass
希望能帮助别人
我遇到此错误,因为模块实际上并未导入 . 代码看起来像这样:
import a.b, a.c # ... something(a.b) something(a.c) something(a.d) # My addition, which failed.
最后一行产生了 AttributeError . 原因是我没有注意到 a ( a.b 和 a.c )的子模块是显式导入的,并假设 import 语句实际导入了 a .
AttributeError
a.b
a.c
import
以上所有答案都很棒,但我想在这里说一声 . 如果您没有发现上述任何问题,请尝试清理您的工作环境 . 它对我有用 .
不确定如何,但以下更改排序了我的问题:
我有文件的名称和导入名称相同,例如我有文件名为emoji.py,我试图导入表情符号 . 但是更改文件名解决了问题 .
希望如此有帮助
当我从git检出旧版本的存储库时遇到了这个问题 . Git替换了我的 .py 文件,但留下了未经跟踪的 .pyc 文件 . 由于 .py 文件和 .pyc 文件不同步, .py 文件中的 import 命令无法在 .pyc 文件中找到相应的模块 .
.py
.pyc
解决方案只是删除 .pyc 文件,并让它们自动重新生成 .
你有共同的顶级导入,这几乎总是一个坏主意 .
如果你真的必须在Python中进行相互导入,那么这样做的方法是在函数中导入它们:
# In b.py: def cause_a_to_do_something(): import a a.do_something()
现在a.py可以安全地做 import b 而不会引起问题 .
import b
(乍一看,似乎 cause_a_to_do_something() 的效率非常低,因为每次调用它都会产生 import ,但事实上导入工作只是第一次完成 . 第二次和以后你导入模块,它很快操作) .
cause_a_to_do_something()
当无意中命名一个与标准Python模块之一同名的模块时,我也看到了这个错误 . 例如 . 我有一个名为 commands 的模块,它也是一个Python库模块 . 这被证明很难跟踪,因为它在我的本地开发环境中正常工作,但在Google App Engine上运行时因指定的错误而失败 .
commands
8 回答
问题是模块之间的循环依赖性 .
a
进口b
和b
进口a
. 但是其中一个需要先加载 - 在这种情况下,当你试图在a
中访问它时,python最终会在b
之前初始化模块a
并且b.hi()
不存在 .我通过引用以错误方式导入的枚举来获得此错误,例如:
正确导入:
希望能帮助别人
我遇到此错误,因为模块实际上并未导入 . 代码看起来像这样:
最后一行产生了
AttributeError
. 原因是我没有注意到a
(a.b
和a.c
)的子模块是显式导入的,并假设import
语句实际导入了a
.以上所有答案都很棒,但我想在这里说一声 . 如果您没有发现上述任何问题,请尝试清理您的工作环境 . 它对我有用 .
不确定如何,但以下更改排序了我的问题:
我有文件的名称和导入名称相同,例如我有文件名为emoji.py,我试图导入表情符号 . 但是更改文件名解决了问题 .
希望如此有帮助
当我从git检出旧版本的存储库时遇到了这个问题 . Git替换了我的
.py
文件,但留下了未经跟踪的.pyc
文件 . 由于.py
文件和.pyc
文件不同步,.py
文件中的import
命令无法在.pyc
文件中找到相应的模块 .解决方案只是删除
.pyc
文件,并让它们自动重新生成 .你有共同的顶级导入,这几乎总是一个坏主意 .
如果你真的必须在Python中进行相互导入,那么这样做的方法是在函数中导入它们:
现在a.py可以安全地做
import b
而不会引起问题 .(乍一看,似乎
cause_a_to_do_something()
的效率非常低,因为每次调用它都会产生import
,但事实上导入工作只是第一次完成 . 第二次和以后你导入模块,它很快操作) .当无意中命名一个与标准Python模块之一同名的模块时,我也看到了这个错误 . 例如 . 我有一个名为
commands
的模块,它也是一个Python库模块 . 这被证明很难跟踪,因为它在我的本地开发环境中正常工作,但在Google App Engine上运行时因指定的错误而失败 .