ChatGPT解决这个技术问题 Extra ChatGPT

AttributeError:“模块”对象没有属性

我有两个 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'

错误是什么意思?我如何解决它?

请注意,您的问题与此答案非常相似。显然,这个答案中的代码可以找到,但你的没有? stackoverflow.com/a/7336880/565879

R
RichieHindle

你有相互的顶级进口,这几乎总是一个坏主意。

如果你真的必须在 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,但实际上导入工作只在第一次完成。第二次和后续导入模块,这是一个快速的操作。)


这比 IMO 解决方案更像是一种解决方法。
@gst 基本上就像用 python 编写的所有内容?
l
lucrussell

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


s
sth

问题是模块之间的循环依赖。 a 导入 bb 导入 a。但其中一个需要先加载 - 在这种情况下,python 最终会在 b 之前初始化模块 a,并且当您尝试在 a 中访问它时 b.hi() 还不存在。


S
Stoyan

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

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

正确导入:

from package.MyEnumClass import MyEnumClass

希望对某人有所帮助


J
JustWe

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

import the_module_name
from importlib import reload
reload(the_module_name)

c
craq

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

解决方案是简单地删除 .pyc 文件,并让它们自动重新生成。


您可以使用此命令删除所有 .pyc 文件:find . -name "*.pyc" -exec rm -f {} \;
D
Dag Høidahl

我遇到了这个错误,因为模块实际上并没有被导入。代码如下所示:

import a.b, a.c

# ...

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

最后一行产生一个 AttributeError。原因是我没有注意到 aa.ba.c)的子模块是显式导入的,并假设 import 语句实际上导入了 a


J
Jian

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


为了补充这个答案:当简说“清理你的工作环境”时,如果你在 Jupyter 笔记本中,你只需“关闭”你的工作 .ipynb(不是环境或机器)并再次打开你的 .ipynb,它就可以了为了我。
B
Behzad Sezari

在 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

更多文档检查:here


H
Hot.PxL

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

问题是当您运行 python a.py 时,它运行 a.py 但未将其标记为作为模块导入。所以反过来 a.py ->导入模块 b ->导入模块 a ->导入模块 b.最后一个 import a no-op,因为 b 当前正在被导入,Python 对此进行了防范。 b 现在是一个空模块。所以当它执行 b.hi() 时,它什么也找不到。

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

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


这是正确的答案恕我直言。很好的解释。
我要补充一点,当他有效地运行 python a.py 时(开始)运行它(还有什么),但不将其标记为已导入 .. 因为它是正在执行的 __main__ 模块。
D
DimaDK

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

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

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

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

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


在这种情况下,您可以编写“从核心导入核心”
K
KBT K.B.T

你保存了'b.py'吗?您必须先保存“b.py”。


正如目前所写的那样,您的答案尚不清楚。请edit添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以找到有关如何写出好答案的更多信息in the help center
这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
我建议不要在答案中使用修辞问题。他们冒着被误解为根本不是答案的风险。您正在尝试回答此页面顶部的问题,不是吗?否则请删除此帖。
请将其表述为有条件的解释性答案,以避免给人一种提出澄清问题而不是回答的印象(应该使用评论而不是答案,比较 meta.stackexchange.com/questions/214173/… )。例如像“如果你的问题是......那么解决方案是......因为......”
g
gst

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

一个.py:

print(__name__)
import b

b.py:

print(__name__)
import a

然后:

$ python3 a.py
__main__
b
a

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


C
Cody Blomberg

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


欢迎来到 StackOverflow。我可以看到您描述的情况是一个问题并导致问题中显示的错误消息,但它与这个特定问题并不真正相关,问题在于循环导入。
P
Prem Singh Bist

让我们通过示例来看看循环依赖是如何到达的问题和解决方案。我有一个文件 window-data-generator.ipynb 主要执行文件 其中导入了以下两个文件。

escape.py MutationTypes.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'

如何解决这个问题?由于您已经在转义模块中导入了 MutationTypes 文件,因此使用转义模块使用 MutationTypes 文件功能,如下所示

ESC.MutationTypes.SINGLE_RES_SUB

M
MD5

不知道如何,但以下更改对我的问题进行了排序:

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

希望有帮助


j
jmunsch

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

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


M
Manuel Lazo

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

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

希望这对其他人有帮助。

问候,


h
hassanzadeh.sd

解决了

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

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

from __future__ import absolute_import 

在 a.py 模块的顶部。


M
Mondaa

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

pip install statsmodels=="0.10.0"