AttributeError: & # 39;模块# 39;对象没有属性

我有两个python模块:

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'

这个误差是什么意思?我该怎么解决呢?

814786 次浏览

问题在于模块之间的循环依赖关系。a导入bb导入a。但是其中一个需要首先加载——在这种情况下,python最终会在b之前初始化模块a,而当你试图在a中访问它时,b.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库模块。这被证明很难追踪,因为它在我的本地开发环境中正确工作,但在谷歌应用程序引擎上运行时失败了。

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

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.

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

以上所有的答案都很棒,但我想在这里插一句。如果你没有发现上面提到的任何问题,试着清理一下你的工作环境。这对我很管用。

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

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

不知道如何,但下面的改变排序我的问题:

我的文件名和导入名称相同,例如我的文件名为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的第一次执行被注册为导入模块。

我也面临同样的问题。

.使用reload修正
import the_module_name
from importlib import reload
reload(the_module_name)

ubuntu 18.04 (virtualenvpython.3.6.x)上,下面的< em >重载< / em >片段解决了问题为我:

< em > main.py < / em >

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

有关更多文档检查:在这里

导入的订单是我遇到问题的原因:

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

这只是另一个例子,类似于richieindie的答案,但是有类。

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

这一次,我的问题是从不同的模块导入Serializers (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模块的顶部。

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

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

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

似乎出于某种原因,git在切换分支时留下了空文件夹

所以我移除了那个文件夹,一切都很顺利

你可以通过添加2个print来理解:

a.py:

print(__name__)
import b

b.py:

print(__name__)
import a

然后:

$ python3 a.py
__main__
b
a

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

在某些情况下,可能只是文件保存在正确的目录中,但在虚拟环境中写入文件时,文件上写入的python还没有保存。因此,当python将a.py导入到b.py时,不会导入任何代码。在其他方面是空白的。这似乎是我经常看到的一个容易识别的错误。值得一查。 科迪< / p >

你是否保存了'b.py' ? 你必须先保存'b.p py'

让我们通过例子来看看问题和解决方案,循环依赖关系是如何到达的。 我有一个文件窗口数据生成器。

. ipynb执行主文件导入如下两个文件
  1. escape.py
  2. MutationTypes.py

escape.py已经导入了MutationTypes.py文件 现在,在窗口数据生成器中。我想执行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