AttributeError:'module'对象没有属性[重复]
- 2025-02-07 08:44:00
- admin 原创
- 95
问题描述:
我有两个python模块:
蟲
import b
def hello():
print "hello"
print "a.py"
print hello()
print b.hi()
py
import a
def hi():
print "hi"
当我运行时a.py
,我得到:
AttributeError: 'module' object has no attribute 'hi'
这个错误是什么意思?我该如何修复它?
解决方案 1:
您有相互的顶级导入,这几乎总是一个坏主意。
如果你确实必须在 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
每次调用它时都会执行一次,但实际上导入工作只在第一次完成。第二次及后续导入模块时,这是一个快速的操作。)
解决方案 2:
当我无意中将模块命名为与标准 Python 模块之一相同的名称时,我也看到了此错误。例如,我有一个名为的模块commands
,它也是一个 Python 库模块。事实证明,这很难追踪,因为它在我的本地开发环境中运行正常,但在 Google App Engine 上运行时出现指定的错误。
解决方案 3:
问题在于模块之间的循环依赖。a
导入b
和b
导入a
。但其中一个需要先加载——在这种情况下,python 最终会a
在之前初始化模块,b
而b.hi()
当您尝试访问它时,它还不存在a
。
解决方案 4:
我通过引用以错误方式导入的枚举来获取此错误,例如:
from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member
正确导入:
from package.MyEnumClass import MyEnumClass
希望对某人有帮助
解决方案 5:
我遇到了同样的问题。已使用修复reload
。
import the_module_name
from importlib import reload
reload(the_module_name)
解决方案 6:
我在从 git 中检出旧版本的存储库时遇到了这个问题。Git 替换了我的.py
文件,但留下了未跟踪的.pyc
文件。由于.py
文件和.pyc
文件不同步,文件import
中的命令.py
无法在.pyc
文件中找到相应的模块。
解决方案很简单,删除这些.pyc
文件,然后让它们自动重新生成。
解决方案 7:
在ubuntu 18.04(virtualenv,python.3.6.x )上,以下重新加载代码片段为我解决了该问题:
主程序
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
更多文档请查看:这里
解决方案 8:
我遇到此错误是因为模块实际上并未导入。代码如下所示:
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
。
解决方案 9:
以上所有答案都很棒,但我想在这里插话。如果您没有发现上述任何问题,请尝试清理您的工作环境。这对我很有效。
解决方案 10:
循环导入会导致问题,但是 Python 有内置的方法来缓解它。
问题是,当你运行 时python a.py
,它会运行a.py
但不会将其标记为已导入的模块。因此依次a.py
-> 导入模块 b -> 导入模块 a -> 导入模块 b。最后一个导入 a 是无操作,因为 b 当前正在被导入,Python 会对此进行防范。而且 b 现在是一个空模块。因此,当它执行 时b.hi()
,它找不到任何东西。
请注意,b.hi()
执行的是在a.py
-> 模块 b -> 模块 a 期间,而不是a.py
直接执行。
python -c 'import a'
在您的具体示例中,您只需在顶层运行即可,因此第一次执行a.py
被注册为导入模块。
解决方案 11:
对我来说,出现此错误的原因是有一个文件夹与我尝试导入的 python 模块同名。
|-- core <-- empty directory on the same level as the module that throws the error
|-- core.py
并且 python 将该文件夹视为一个 python 包,并尝试从该空包“core”导入,而不是从 core.py 导入。
似乎出于某种原因,git 在分支切换期间留下了那个空文件夹
所以我删除了该文件夹,一切正常
解决方案 12:
您保存了“b.py”吗?您必须先保存“b.py”。
解决方案 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:
你可以通过添加两个打印来了解发生了什么:
复制代码
print(__name__)
import b
复制代码
print(__name__)
import a
然后:
$ python3 a.py
__main__
b
a
因此a.py
最终被加载/执行了 2 次。一次作为__main__
,一次作为a
。
解决方案 15:
在某些情况下,可能只是文件保存在正确的目录中,但在虚拟环境中写入文件时,文件上写的 python 尚未保存。因此,当 python 将 a.py 导入到 b.py 时,没有导入任何代码。换句话说,它是空白的。这似乎是我经常看到的一个容易识别的错误。值得检查。-Cody
解决方案 16:
让我们通过示例来了解循环依赖是如何产生的,以及问题和解决方案。我有一个文件 window-data-generator.ipynb 主执行文件,其中导入了以下两个文件。
逃逸.py
突变类型.py
escape.py已经导入了MutationTypes.py文件现在,在 window-data-generator.ipynb 文件中,我想执行 MutationTypes.py 的功能如下:
import escape as ESC
import MutationTypes
MutationTypes.SINGLE_RES_SUB
错误提示如下AttributeErrorTraceback (most recent call last) /tmp/ipykernel_4340/4282764781.py in <module> ----> 1 MutationTypes.SINGLE_RES_SUB AttributeError: module 'MutationTypes' has no attribute 'SINGLE_RES_SUB'
如何解决这个问题?
由于您已经在 escape 模块中导入了MutationTypes文件,因此请使用 escape 模块中的 MutationTypes 文件功能,如下所示
ESC.MutationTypes.SINGLE_RES_SUB
解决方案 17:
不确定如何,但以下更改解决了我的问题:
我的文件名和导入名相同,例如我的文件名是 emoji.py,我试图导入表情符号。但更改文件名解决了这个问题。
希望有帮助
解决方案 18:
导入的顺序是我遇到问题的原因:
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 的答案,但带有类别。
解决方案 19:
解决
Python 正在寻找a.py模块中的 a 对象。
将该文件重命名为其他文件或使用
from __future__ import absolute_import
在你的a.py模块的顶部。
解决方案 20:
在我使用 python 2.7 和 numpy 版本 1.15.0 的情况下,它可以与
pip install statsmodels=="0.10.0"
扫码咨询,免费领取项目管理大礼包!