AttributeError:“模块”对象没有属性
Posted
技术标签:
【中文标题】AttributeError:“模块”对象没有属性【英文标题】:AttributeError: 'module' object has no attribute 【发布时间】:2010-11-18 00:25:33 【问题描述】:我有两个 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'
错误是什么意思?我该如何解决?
【问题讨论】:
请注意,您的问题与此答案非常相似。显然,这个答案中的代码可以找到,但你的没有? ***.com/a/7336880/565879 【参考方案1】:问题是模块之间的循环依赖。 a
导入 b
和 b
导入 a
。但是其中一个需要先加载 - 在这种情况下,python 最终会在 b
之前初始化模块 a
,当您尝试在 a
中访问它时,b.hi()
尚不存在。
【讨论】:
【参考方案2】:你们有相互的***进口,这几乎总是一个坏主意。
如果你真的必须在 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
,但实际上导入工作只在第一次完成。第二次和随后的时间你导入一个模块,操作很快。)
【讨论】:
这更像是一种解决方法,而不是 IMO 的解决方案。 @gst 基本上就像用python编写的所有东西?【参考方案3】:当我无意中将一个模块命名为与标准 Python 模块之一同名时,我也看到了这个错误。例如。我有一个名为 commands
的模块,它也是一个 Python 库模块。事实证明,这很难追踪,因为它在我的本地开发环境中正常工作,但在 Google App Engine 上运行时失败并出现指定错误。
【讨论】:
【参考方案4】:我通过引用以错误方式导入的枚举出现此错误,例如:
from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member
正确的导入:
from package.MyEnumClass import MyEnumClass
希望对某人有所帮助
【讨论】:
【参考方案5】:我遇到了这个错误,因为模块实际上并没有被导入。代码如下所示:
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
。
【讨论】:
【参考方案6】:以上所有答案都很棒,但我想在这里插话。如果您没有发现上述任何问题,请尝试清理您的工作环境。它对我有用。
【讨论】:
【参考方案7】:当我从 git 签出旧版本的存储库时遇到了这个问题。 Git 替换了我的 .py
文件,但留下了未跟踪的 .pyc
文件。由于.py
文件和.pyc
文件不同步,.py
文件中的import
命令在.pyc
文件中找不到对应的模块。
解决办法就是删除.pyc
文件,让它们自动重新生成。
【讨论】:
可以使用该命令删除所有.pyc
文件:find . -name "*.pyc" -exec rm -f \;
【参考方案8】:
不知道如何,但以下更改对我的问题进行了排序:
我的文件名和导入名相同,例如,我的文件名是 emoji.py,我正在尝试导入表情符号。但是更改文件名解决了这个问题。
希望对你有帮助
【讨论】:
【参考方案9】:循环导入会导致问题,但 Python 有内置方法来缓解它。
问题是当您运行python a.py
时,它运行a.py
但没有将其标记为导入为模块。所以依次a.py
-> 导入模块 b -> 导入模块 a -> 导入模块 b。最后一个 import a no-op,因为 b 当前正在被导入,Python 对此进行了防范。 b 现在是一个空模块。所以当它执行b.hi()
时,什么都找不到。
请注意,被执行的b.hi()
是在a.py
-> 模块b -> 模块a 期间,而不是直接在a.py
中。
在您的具体示例中,您可以只在顶层运行python -c 'import a'
,因此a.py
的第一次执行被注册为导入模块。
【讨论】:
这是正确的答案恕我直言。解释得很好。 我要补充一点,当他运行python a.py
时,它会有效地(开始)运行它(还有什么),但不会将其标记为导入的......因为它是正在执行的__main__
模块。 【参考方案10】:
我遇到了同样的问题。
使用reload
修复。
import the_module_name
from importlib import reload
reload(the_module_name)
【讨论】:
【参考方案11】:在 ubuntu 18.04(virtualenv,python.3.6.x)上,重新加载 sn-p 为我解决了这个问题:
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
更多文档检查:here
【讨论】:
【参考方案12】:导入的顺序是我遇到问题的原因:
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
这只是另一个外观示例,类似于 RichieHindie 的答案,但带有类。
【讨论】:
【参考方案13】:我已经多次遇到这个问题,但我没有尝试更深入地挖掘它。现在我明白了主要问题。
这次我的问题是从不同的模块导入序列化程序(django 和 restframework),例如:
from rest_framework import serializers
from common import serializers as srlz
from prices import models as mdlpri
# the line below was the problem 'srlzprod'
from products import serializers as srlzprod
我遇到了这样的问题:
from product import serializers as srlzprod
ModuleNotFoundError: No module named 'product'
我想要完成的是:
class CampaignsProductsSerializers(srlz.DynamicFieldsModelSerializer):
bank_name = serializers.CharField(trim_whitespace=True,)
coupon_type = serializers.SerializerMethodField()
promotion_description = serializers.SerializerMethodField()
# the nested relation of the line below
product = srlzprod.ProductsSerializers(fields=['id','name',],read_only=True,)
所以,正如上面提到的如何解决它(***导入),我继续进行以下更改:
# change
product = srlzprod.ProductsSerializers(fields=['id','name',],read_only=True,)
# by
product = serializers.SerializerMethodField()
# and create the following method and call from there the required serializer class
def get_product(self, obj):
from products import serializers as srlzprod
p_fields = ['id', 'name', ]
return srlzprod.ProductsSerializers(
obj.product, fields=p_fields, many=False,
).data
因此,django runserver 执行没有问题:
./project/settings/manage.py runserver 0:8002 --settings=settings_development_mlazo
Performing system checks...
System check identified no issues (0 silenced).
April 25, 2020 - 13:31:56
Django version 2.0.7, using settings 'settings_development_mlazo'
Starting development server at http://0:8002/
Quit the server with CONTROL-C.
代码行的最终状态如下:
from rest_framework import serializers
from common import serializers as srlz
from prices import models as mdlpri
class CampaignsProductsSerializers(srlz.DynamicFieldsModelSerializer):
bank_name = serializers.CharField(trim_whitespace=True,)
coupon_type = serializers.SerializerMethodField()
promotion_description = serializers.SerializerMethodField()
product = serializers.SerializerMethodField()
class Meta:
model = mdlpri.CampaignsProducts
fields = '__all__'
def get_product(self, obj):
from products import serializers as srlzprod
p_fields = ['id', 'name', ]
return srlzprod.ProductsSerializers(
obj.product, fields=p_fields, many=False,
).data
希望这对其他人有帮助。
您好,
【讨论】:
【参考方案14】:在我使用带有 numpy 版本 1.15.0 的 python 2.7 的情况下,它适用于
pip install statsmodels=="0.10.0"
【讨论】:
【参考方案15】:已解决
Python 正在您的 a.py 模块中寻找 a 对象。
将该文件重命名到其他文件或使用
from __future__ import absolute_import
在 a.py 模块的顶部。
【讨论】:
【参考方案16】:对我来说,这个错误的原因是有一个与我尝试导入的 python 模块同名的文件夹。
|-- core <-- empty directory on the same level as the module that throws the error
|-- core.py
并且python将该文件夹视为python包并尝试从那个空包“core”导入,而不是从core.py。
似乎由于某种原因,git 在分支切换期间离开了那个空文件夹
所以我刚刚删除了那个文件夹,一切都很顺利
【讨论】:
【参考方案17】:您可以通过添加 2 个打印来了解发生了什么:
a.py:
print(__name__)
import b
b.py:
print(__name__)
import a
然后:
$ python3 a.py
__main__
b
a
所以a.py
最终被加载/执行了 2 次。一个是__main__
,一个是a
。
【讨论】:
【参考方案18】:在某些情况下,可能只是文件保存在正确的目录中,但写入文件的 python 在虚拟环境中写入时尚未保存。因此,当 python 将 a.py 导入 b.py 时,没有导入任何代码。在其他方面它是空白的。似乎是我经常看到的易于识别的错误。值得检查。 -科迪
【讨论】:
欢迎来到 ***。我可以看到您描述的情况是一个问题并导致问题中显示的错误消息,但它与这个特定问题并不真正相关,问题在于循环导入。以上是关于AttributeError:“模块”对象没有属性的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError:“模块”对象没有属性“百分位”
无法安装模块 - AttributeError: 'NoneType' 对象没有属性 'loader'