我有两个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可以放心地做import b
不会引起问题。
(乍看之下,似乎会cause_a_to_do_something()
将非常低效的,因为它的import
每次调用它,但实际上进口工作只能够完成第一次。你导入一个模块的第二次及以后,它的一个快速的操作。)
我也看到了这个错误时,无意中命名具有相同的名称作为标准的模块中的一个模块。 例如,我有一个名为模块commands
,这也是一个Python库模块。 这被证明是难以追查,因为它工作正常我本地开发环境,但在谷歌App Engine上运行时使用指定的错误而失败。
问题是模块之间的循环依赖关系。 a
进口b
和b
进口a
。 但需要其中的一个首先装载-在这种情况下,蟒蛇结束初始化模块a
前b
和b.hi()
当您尝试访问它还不存在a
。
我通过引用这是在一个错误的方式,例如进口枚举得到这个错误:
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
( ab
和ac
) 明确了进口,并假定import
语句实际进口a
。
我就遇到了这个问题,当我检查了从混帐存储库的旧版本。 Git的取代了我.py
文件,但留下的未跟踪.pyc
的文件。 由于.py
文件和.pyc
的文件是不同步的,在import
的命令.py
文件找不到在相应的模块.pyc
的文件。
解决的办法是简单地删除.pyc
的文件,并让他们自动再生。
以上所有的答案都是伟大的,但我想在这里插入内容。 如果没有发现上述的任何问题,请尝试清理您的工作环境。 它为我工作。
不知道怎么样,但下面的变化排序我的问题:
我有文件,并导入名称相同的比如我有文件名作为emoji.py和我试图导入的表情符号的名称。 但是,更改文件名来解决这个问题。
所以希望它可以帮助
圆形进口造成问题,但是Python有办法减轻它内置。
问题是,当你运行python a.py
,它运行a.py
,但没有将它标记导入为模块。 所以反过来a.py
- >进口模块B - >进口模块- >导入模块B。 上次导入由于B无操作,目前正在进口和打击了Python警卫。 和b是一个空的模块了。 因此执行时b.hi()
它不能发现任何东西。
注意, b.hi()
访问内容被执行时期间a.py
- >模块B - >模块,而不是在a.py
直接。
在您的具体的例子,你可以运行python -c 'import a'
在顶层,所以第一次执行a.py
被注册为导入模块。