Python 属性错误:';模块';对象没有属性
我有两个python模块: a、 派克 b、 派克 当我运行Python 属性错误:';模块';对象没有属性,python,attributeerror,Python,Attributeerror,我有两个python模块: a、 派克 b、 派克 当我运行a.py时,我得到: AttributeError: 'module' object has no attribute 'hi' 这个错误意味着什么?如何修复它?问题在于模块之间的循环依赖关系a导入b和b导入a。但是需要首先加载其中一个模块-在这种情况下,python在b和b之前初始化模块a,而b.hi()还不存在。当您尝试在a中访问它时,您会有相互的顶级导入,这几乎总是一个坏主意 如果您确实必须在Python中进行相互导入,方法是在
a.py
时,我得到:
AttributeError: 'module' object has no attribute 'hi'
这个错误意味着什么?如何修复它?问题在于模块之间的循环依赖关系<代码>a导入
b
和b
导入a
。但是需要首先加载其中一个模块-在这种情况下,python在b
和b之前初始化模块a
,而b.hi()
还不存在。当您尝试在a
中访问它时,您会有相互的顶级导入,这几乎总是一个坏主意
如果您确实必须在Python中进行相互导入,方法是在函数中导入它们:
# In b.py:
def cause_a_to_do_something():
import a
a.do_something()
现在a.py可以安全地导入b而不会引起问题
(乍一看,cause_a_to_do_something()
似乎效率极低,因为它每次调用时都执行导入
,但实际上导入工作只在第一次完成。第二次及以后导入模块时,这是一个快速操作。)我在无意中使用与标准Python模块之一相同的名称命名模块时也看到了这个错误。例如,我有一个名为commands
的模块,它也是一个Python库模块。这被证明是很难跟踪的,因为它在我的本地开发环境中正常工作,但在Google App Engine上运行时出现指定错误而失败。我是通过引用以错误方式导入的枚举获得此错误的,例如:
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.
最后一行产生了一个属性错误
。原因是我没有注意到a
(a.b
和a.c
)的子模块是显式导入的,并且假设import
语句实际上导入了a
,以上所有答案都很好,但我想在此插话。如果您没有发现上述任何问题,请尝试清理您的工作环境。它对我很有效。当我从git签出旧版本的存储库时,遇到了这个问题。Git替换了我的.py
文件,但保留了未跟踪的.pyc
文件。由于.py
文件和.pyc
文件不同步,因此.py
文件中的导入
命令无法在.pyc
文件中找到相应的模块
解决方案只是删除.pyc
文件,并让它们自动重新生成。不确定如何排序,但以下更改对我的问题进行了排序:
我的文件名和导入名相同,例如我的文件名为emoji.py,我正在尝试导入emoji。但更改文件名解决了这个问题
希望它能帮助循环导入造成问题,但是Python有一些内置的方法来缓解它
问题是,当您运行python a.py
时,它会运行a.py
,但不会将其标记为导入模块。因此,依次导入模块b->导入模块a->导入模块b。上一次导入没有操作,因为b当前正在导入,Python对此进行了防范。b现在是一个空模块。因此,当它执行b.hi()
时,它找不到任何东西
请注意,执行的b.hi()
是在a.py
->module b->module a期间执行的,而不是直接在a.py
中执行的
在您的特定示例中,您可以在顶层运行python-c'import a'
,因此a.py
的第一次执行被注册为导入模块。我遇到了同样的问题。
通过使用重新加载
修复
import the_module_name
from importlib import reload
reload(the_module_name)
在ubuntu 18.04(virtualenv,python.3.6.x)上,以下重新加载片段解决了我的问题:
main.py
其中:
|--main.py
|--my_module.py
有关更多文档检查:导入的顺序是我遇到问题的原因:
a.py
:
############
#这是一个问题
#把这个移到下面
#############
从b进口纽廷
类问题(对象):
通过
A类(对象):
###############
#加在这里
#从b进口纽廷
###############
nt=NewThing()
通过
b.py
:
来自导入问题的
新课程(问题):
通过
这只是另一个例子,与RichieHindie的答案类似,但与课堂有关。我已经多次讨论过这个问题,但我没有试图深入研究它。现在我明白了主要问题
这次我的问题是从不同的模块导入序列化程序(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
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,)
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
我遇到了这样的问题:
from product import serializers as srlzprod
ModuleNotFoundError: No module named 'product'
我想要完成的是以下几点:
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
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,)
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
因此,正如上面几行提到的如何解决它(顶级导入),我继续进行以下更改:
# 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
# the line below was the problem 'srlzprod'
from products import serializers as srlzprod
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,)
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
希望这能对其他人有所帮助
您好,在我使用Python2.7和numpy版本1.15.0的情况下,它与
pip install statsmodels=="0.10.0"
已解决
Python正在您的a.py模块中查找对象
将该文件重命名为其他文件或使用
from __future__ import absolute_import
在a.py模块的顶部。对于我来说,出现此错误的原因是有一个文件夹与我尝试导入的python模块同名
|-- core <-- empty directory on the same level as the module that throws the error
|-- core.py
|——请注意,您的问题与此答案非常相似。显然,这个答案中的代码只适用于f