属性错误: 'module'对象没有属性

252

I have two python modules:

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'

这个错误的意思是什么?我该怎么修复它?


请注意,您的问题与此答案非常相似。显然,此答案中的代码可以正常工作,但是您的代码不能?https://dev59.com/GGs05IYBdhLWcg3wR_63#7336880 - Buttons840
20个回答

3

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

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

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

看起来由于某种原因,git 在分支切换过程中保留了该空文件夹。

所以我只需删除该文件夹,一切都可以正常工作。


在这种情况下,您可以编写“from core import core”。 - Ahmadiah

1

你是否已保存了'b.py'文件? 在执行操作前,你必须先保存‘b.py’文件。


目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Ari Cooper-Davis
我建议在回答中不要使用修辞性问题。它们可能会被误解为根本不是答案。你是在尝试回答这个页面顶部的问题,对吗?否则请删除此帖子。 - Yunnosch
请将此翻译为解释性条件答案,以避免给人询问澄清问题的印象,而不是回答问题(应该使用评论代替答案,请参见https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead)。例如,“如果您的问题是...,那么解决方案是...,因为...。” - Yunnosch

0
让我们通过示例来看看循环依赖是如何产生的问题和解决方案。 我有一个文件 window-data-generator.ipynb 作为主执行文件,其中导入了以下两个文件。
  1. escape.py
  2. MutationTypes.py

escape.py 已经导入了 MutationTypes.py 文件。 现在,在 window-data-generator.ipynb 文件中,我想执行 MutationTypes.py 的功能,如下所示:

import escape as ESC
import MutationTypes
MutationTypes.SINGLE_RES_SUB 

错误提示为AttributeErrorTraceback(最近的调用最后一次)/ tmp / ipykernel_4340 / 4282764781.py中的<module> - > 1 MutationTypes.SINGLE_RES_SUB AttributeError:模块'MutationTypes'没有属性'SINGLE_RES_SUB'

如何解决?由于您已经在转义模块内导入了文件,请使用以下方式使用文件功能:

ESC.MutationTypes.SINGLE_RES_SUB

0

通过添加两个打印,你可以理解正在发生的事情:

a.py:

print(__name__)
import b

b.py :

print(__name__)
import a

然后:

$ python3 a.py
__main__
b
a

所以 a.py 最终会被加载/执行两次,一次是作为__main__,另一次是作为a


0
在某些情况下,问题可能仅仅是文件被保存在正确的目录中,但是当在虚拟环境中编写时文件中的Python代码还未保存。因此,当Python将a.py导入b.py时,并没有导入任何代码。换句话说,代码是空白的。这似乎是一种容易识别的错误,我经常看到这种情况。值得检查。 -Cody

欢迎来到StackOverflow。我能理解你所描述的情况可能会导致问题并引起问题中显示的错误信息,但这与本特定问题无关,问题出在循环导入上。 - joanis

-1

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

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的答案,但使用了类。


-1

不确定是怎么回事,但以下更改解决了我的问题:

我原本的文件名和导入名称相同,例如我的文件名为emoji.py,我尝试导入emoji。但更改文件名解决了这个问题。

希望能对你有所帮助。


-1

我曾多次遇到这个问题,但我没有深入挖掘它。现在我明白了主要问题。

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

希望这对其他人有所帮助。

问候,


-1

已解决

Python正在你的a.py模块中寻找一个对象。

要么将那个文件重命名为其他名称,要么使用

from __future__ import absolute_import 

在你的 a.py 模块的顶部。

-2
在我的情况下,使用Python 2.7和NumPy版本1.15.0进行编程时,它可以正常工作。
pip install statsmodels=="0.10.0"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接