247 votes

AttributeError : l'objet 'module' n'a pas d'attribut

J'ai deux modules 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"

Quand je cours a.py j'obtiens :

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

Que signifie l'erreur ? Comment puis-je la corriger ?

0 votes

Notez que votre question est très similaire à cette réponse. Apparemment, le code de cette réponse fonctionne, mais pas le vôtre ? stackoverflow.com/a/7336880/565879

238voto

RichieHindle Points 98544

Vous avez des importations mutuelles de premier niveau, ce qui est presque toujours une mauvaise idée.

Si vous devez vraiment avoir des importations mutuelles en Python, la façon de le faire est de les importer à l'intérieur d'une fonction :

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

Maintenant, a.py peut faire en toute sécurité import b sans causer de problèmes.

(À première vue, il peut sembler que cause_a_to_do_something() serait extrêmement inefficace parce qu'il fait une import chaque fois que vous l'appelez, mais en fait le travail d'importation n'est effectué que la première fois. La deuxième fois et les fois suivantes que vous importez un module, c'est une opération rapide).

5 votes

Il s'agit plus d'une solution de contournement que d'une solution IMO.

2 votes

@gst donc en gros tout ce qui est écrit en python ?

116voto

lrussell Points 2542

J'ai également constaté cette erreur en nommant par inadvertance un module portant le même nom qu'un des modules standard de Python. Par exemple, j'avais un module appelé commands qui est également un module de la bibliothèque Python. Il s'est avéré difficile à localiser car il fonctionnait correctement sur mon environnement de développement local mais échouait avec l'erreur spécifiée lorsqu'il était exécuté sur Google App Engine.

52voto

sth Points 91594

Le problème est la dépendance circulaire entre les modules. a importations b y b importations a . Mais l'un d'entre eux doit être chargé en premier - dans ce cas, python finit par initialiser le module a antes de b y b.hi() n'existe pas encore lorsque vous essayez d'y accéder dans la rubrique a .

27voto

Stoyan Points 269

J'ai obtenu cette erreur en faisant référence à un enum qui a été importé d'une mauvaise manière, par exemple :

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

Importation correcte :

from package.MyEnumClass import MyEnumClass

J'espère que cela aidera quelqu'un

9voto

Jiu Points 1559

J'ai rencontré le même problème. corrigé en utilisant reload .

import the_module_name
from importlib import reload
reload(the_module_name)

0 votes

C'est très intéressant. Savez-vous pourquoi certaines pièces d'un module peuvent être manquantes ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X