繁体   English   中英

AttributeError: 'module' 对象没有属性

[英]AttributeError: 'module' object has no attribute

我有两个 python 模块:

一个.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 ,但实际上导入工作只在第一次完成。第二次和后续导入模块时,它是快速操作。)

当我无意中将一个模块命名为与标准 Python 模块之一同名时,我也看到了这个错误。 例如,我有一个名为commands的模块,它也是一个 Python 库模块。 这被证明很难追踪,因为它在我的本地开发环境中正常工作,但在 Google App Engine 上运行时失败并出现指定的错误。

问题是模块之间的循环依赖。 a进口bb进口a 但需要其中的一个首先装载-在这种情况下,蟒蛇结束了初始化模块abb.hi()当您尝试访问它还不存在a

我通过引用以错误方式导入的枚举得到了这个错误,例如:

from package import MyEnumClass
# ...
# in some method:
return MyEnumClass.Member

正确导入:

from package.MyEnumClass import MyEnumClass

希望能帮助某人

我遇到了同样的问题。 使用reload修复。

import the_module_name
from importlib import reload
reload(the_module_name)

我遇到此错误是因为该模块实际上并未导入。 代码如下所示:

import a.b, a.c

# ...

something(a.b)
something(a.c)
something(a.d)  # My addition, which failed.

最后一行导致AttributeError 原因是我没有注意到aabac )的子模块被显式导入,并假设import语句实际上导入a

当我从 git 检出旧版本的存储库时遇到了这个问题。 Git 替换了我的.py文件,但留下了未跟踪的.pyc文件。 由于.py文件和.pyc文件不同步, .py文件中的import命令在.pyc文件中找不到对应的模块。

解决办法就是删除.pyc文件,让它们自动重新生成。

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

更多文档检查: 这里

以上所有答案都很棒,但我想在这里插一句。 如果您没有发现上述任何问题,请尝试清理您的工作环境。 它对我有用。

对我来说,这个错误的原因是有一个与我试图导入的 python 模块同名的文件夹。

|-- core  <-- empty directory on the same level as the module that throws the error
|-- core.py

并且 python 将该文件夹视为 python 包并尝试从该空包“core”中导入,而不是从 core.py 中导入。

似乎由于某种原因 git 在分支切换期间离开了那个空文件夹

所以我只是删除了那个文件夹,一切都像魅力一样

不确定如何但以下更改对我的问题进行了排序:

我的文件名和导入名称相同,例如我的文件名为 emoji.py,我试图导入表情符号。 但是更改文件名解决了这个问题。

希望有帮助

循环导入会导致问题,但 Python 有内置的方法来缓解它。

问题是当您运行python a.py ,它运行a.py但没有将其标记为模块导入。 所以依次a.py -> 导入模块 b -> 导入模块 a -> 导入模块 b。 最后一次导入一个无操作,因为当前正在导入 b 并且 Python 对此进行防范。 b 现在是一个空模块。 所以当它执行b.hi() ,它找不到任何东西。

请注意,执行的b.hi()是在a.py -> 模块 b -> 模块 a 期间,而不是直接在a.py

在您的具体示例中,您可以在顶层运行python -c 'import a' ,因此a.py的第一次执行被注册为导入模块。

@ MD5对我一样,请尝试更改模块名称或直接导入功能

导入顺序是我遇到问题的原因:

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 的答案,但带有类。

我已经多次遇到这个问题,但我没有尝试更深入地研究它。 现在我明白了主要问题。

这次我的问题是从不同的模块导入序列化程序(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

希望这对其他人有帮助。

你好,

在我使用 python 2.7 和 numpy 版本 1.15.0 的情况下,它与

pip install statsmodels=="0.10.0"

解决了

Python 正在您的a.py模块中寻找 a 对象。

将该文件重命名为其他内容或使用

from __future__ import absolute_import 

a.py模块的顶部。

您可以通过添加 2 个打印来了解发生了什么:

一个.py:

print(__name__)
import b

乙:

print(__name__)
import a

然后:

$ python3 a.py
__main__
b
a

所以a.py最终被加载/执行 2 次。 一个如__main__和一个作为a

在某些情况下,可能只是文件保存在正确的目录中,但是在虚拟环境中写入文件时,尚未保存写入文件的python。 所以当 python 将 a.py 导入到 b.py 时,没有导入任何代码。 在其他方面它是空白的。 似乎是我经常看到的一个易于识别的错误。 值得检查。 -科迪

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM