AttributeError: ‘module’ object heeft geen attribuut

Ik heb twee 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"

Als ik a.pyuitvoer, krijg ik:

AttributeError: 'module' object has no attribute 'hi'

Wat betekent de fout? Hoe los ik het op?


Antwoord 1, autoriteit 100%

Je hebt wederzijdse import op het hoogste niveau, wat bijna altijd een slecht idee is.

Als je echt wederzijdse imports in Python moet hebben, kun je dit doen door ze binnen een functie te importeren:

# In b.py:
def cause_a_to_do_something():
    import a
    a.do_something()

A.py kan nu veilig import bdoen zonder problemen te veroorzaken.

(Op het eerste gezicht lijkt het misschien dat cause_a_to_do_something()enorm inefficiënt zou zijn omdat het elke keer dat je het aanroept een importdoet, maar in feite werkt het importeren alleen wordt de eerste keer gedaan. De tweede en volgende keren dat u een module importeert, is een snelle handeling.)


Antwoord 2, autoriteit 49%

Ik heb deze fout ook gezien toen ik per ongeluk een module een naam gaf met dezelfde naam als een van de standaard Python-modules. bijv. Ik had een module met de naam commandsdie ook een Python-bibliotheekmodule is. Dit bleek moeilijk op te sporen omdat het correct werkte in mijn lokale ontwikkelomgeving, maar mislukte met de opgegeven fout bij het uitvoeren op Google App Engine.


Antwoord 3, autoriteit 21%

Het probleem is de circulaire afhankelijkheid tussen de modules. aimporteert ben bimporteert a. Maar een van hen moet eerst worden geladen – in dit geval initialiseert python module avoordat ben b.hi()niet’ het bestaat nog niet wanneer je het probeert te openen in a.


Antwoord 4, autoriteit 12%

Ik kreeg deze fout door te verwijzen naar een opsomming die op een verkeerde manier is geïmporteerd, bijvoorbeeld:

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

Correcte import:

from package.MyEnumClass import MyEnumClass

Ik hoop dat het iemand helpt


Antwoord 5, autoriteit 4%

Ik had hetzelfde probleem.
opgelost door reloadte gebruiken.

import the_module_name
from importlib import reload
reload(the_module_name)

Antwoord 6, autoriteit 3%

Ik heb deze fout ervaren omdat de module niet daadwerkelijk is geïmporteerd. De code zag er als volgt uit:

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

De laatste regel resulteerde in een AttributeError. De oorzaak was dat ik niet had opgemerkt dat de submodules van a(a.ben a.c) explicietwaren geïmporteerd , en aangenomen dat de import-instructie daadwerkelijk aimporteerde.


Antwoord 7, autoriteit 3%

Ik heb dit probleem tegengekomen toen ik een oudere versie van een repository van Git uitcheckte. Git heeft mijn .py-bestanden vervangen, maar verliet de niet-gesraceerde .pycbestanden. Sinds de .pybestanden en .pycbestanden waren buiten de synchronisatie, de importopdracht in een .pybestand Kon de bijbehorende module niet vinden in de .pycbestanden.

De oplossing was gewoon om de .pyc-bestanden te verwijderen en laat ze automatisch worden geregenereerd.


Antwoord 8, Autoriteit 2%

Op Ubuntu 18.04 (VIRUALENV , Python.3.6.x ), de volgende Reload Snippet Opgelost Het probleem voor mij:

Main.py

import my_module  # my_module.py
from importlib import reload # reload 
reload(my_module)
print(my_module)
print(my_modeule.hello())

Waar:

|--main.py    
|--my_module.py

Voor meer documentatie check: hier


Antwoord 9

Alle bovenstaande antwoorden zijn geweldig, maar ik zou hier graag bellen. Als u geen probleem hebt opgenomen, probeer dan uw werkomgeving op te ruimen. Het werkte voor mij.


Antwoord 10

Voor mij was de reden voor deze fout dat er een map was met dezelfde naam als de Python-module die ik probeerde te importeren.

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

En python behandelde die map als een python-pakket en probeerde uit dat lege pakket “core” te importeren, niet uit core.py.

Het lijkt erop dat git om de een of andere reden die lege map heeft achtergelaten tijdens het wisselen van branches

Dus ik heb die map net verwijderd en alles werkte als een tierelier


Antwoord 11

Ik weet niet hoe, maar de onderstaande wijziging loste mijn probleem op:

ik had de naam van het bestand en de importnaam hetzelfde, bijvoorbeeld ik had een bestandsnaam als emoji.py en ik probeerde emoji te importeren. Maar het veranderen van de naam van het bestand loste het probleem op.

Ik hoop dat het helpt


Antwoord 12

Circulaire imports veroorzaken problemen, maar Python heeft ingebouwde manieren om dit te verminderen.

Het probleem is dat wanneer u python a.pyuitvoert, het a.pyuitvoert maar het niet als een module importeert. Dus op zijn beurt a.py-> importeert module b -> importeert module a -> invoermodule b. De laatste import a no-op sinds b wordt momenteel geïmporteerd en Python beschermt daartegen. En b is voorlopig een lege module. Dus wanneer het b.hi()uitvoert, kan het niets vinden.

Merk op dat de b.hi()die werd uitgevoerd tijdens a.py-> module b -> module a, niet rechtstreeks in a.py.

In uw specifieke voorbeeld kunt u gewoon python -c 'import a'op het hoogste niveau uitvoeren, zodat de eerste uitvoering van a.pywordt geregistreerd als importeren een module.


Antwoord 13

De volgordevan het importeren was de reden waarom ik problemen had:

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

Gewoon een voorbeeld van hoe het kan uitzien, vergelijkbaar met het antwoord van Richiehindie, maar met klassen.


Antwoord 14

Ik heb vele malen met dit probleem overgestoken, maar ik probeerde niet dieper over te graven. Nu begrijp ik het belangrijkste probleem.

Deze keer importeerde mijn probleem serializers (Django en het restframework) uit verschillende modules, zoals het volgende:

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

Ik had een probleem als deze:

from product import serializers as srlzprod
ModuleNotFoundError: No module named 'product'

Wat ik wilde bereiken, was het volgende:

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,)

Zo, zoals vermeld door de bovenstaande regels Hoe het op te lossen (import op het hoogste niveau), ga ik verder met de volgende wijzigingen:

# 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

Daarom werd django runserver zonder problemen uitgevoerd:

./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.

De eindtoestand van de coderegels was de volgende:

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

Ik hoop dat dit nuttig kan zijn voor alle anderen.

Gegroet,


Antwoord 15

In mijn geval werkt het met Python 2.7 met numpy versie 1.15.0, het werkte met

pip install statsmodels=="0.10.0"

Antwoord 16

Opgelost

Python is op zoek naar het een object in uw a.py -module.

Of Hernoemen dat bestand naar iets anders of gebruik

from __future__ import absolute_import 

Aan de bovenkant van uw a.py module.

Other episodes