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() pyimport a def hi(): print "...

问题描述:

我有两个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导入bb导入a。但其中一个需要先加载——在这种情况下,python 最终会a在之前初始化模块,bb.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.04virtualenvpython.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.ba.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 主执行文件,其中导入了以下两个文件。

  1. 逃逸.py

  2. 突变类型.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"
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2606  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1558  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   40  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   38  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   33  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用