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, je reçois:

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

Que signifie l'erreur? Comment puis-je résoudre ce problème?

140
demandé sur Eric Leschinski 2009-08-09 03:12:20

7 réponses

Vous avez des importations mutuelles de haut 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 dans 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 car il fait un import chaque fois que vous l'appelez, mais en fait le travail d'importation ne se fait que la première fois. La deuxième fois et les suivantes vous importer un module, c'est une opération rapide.)

146
répondu RichieHindle 2009-08-08 23:27:29

J'ai également vu cette erreur en nommant par inadvertance un module avec le même nom que l'un des modules Python standard. Par exemple, j'avais un module appelé commands qui est aussi un module de bibliothèque Python. Cela s'est avéré difficile à traquer car il a fonctionné correctement sur mon environnement de développement local, mais a échoué avec l'erreur spécifiée lors de L'exécution sur Google App Engine.

72
répondu lucrussell 2010-06-26 14:18:21

Le problème est la dépendance circulaire entre les modules. a importations b et b importations a. Mais l'un d'eux doit être chargé en premier - dans ce cas, le python se termine l'initialisation du module a avant b et b.hi() n'existe pas, lorsque vous essayez d'accéder à a.

38
répondu sth 2009-08-08 23:19:41

J'ai eu cette erreur en référençant une énumération qui a été importée de manière incorrecte, par exemple:

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

Importation correcte:

from package.MyEnumClass import MyEnumClass

J'espère que cela aide quelqu'un

16
répondu Stoyan 2015-04-16 23:32:08

J'ai rencontré cette erreur car le module n'a pas été réellement importé. Le code ressemblait à ceci:

import a.b, a.c

# ...

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

La dernière ligne a donné un AttributeError. La cause était que je n'avais pas remarqué que les sous-modules de a (a.b et a.c) étaient explicitement importés, et supposaient que l'instruction import effectivement importée a.

7
répondu Dag Høidahl 2016-06-24 20:26:45

Toutes les réponses ci-dessus sont géniales, mais j'aimerais jouer ici. Si vous n'avez repéré aucun problème mentionné ci-dessus, essayez d'éclaircir votre environnement de travail. Il a travaillé pour moi.

2
répondu Jian 2018-06-06 18:21:29

J'ai rencontré ce problème lorsque j'ai extrait une ancienne version d'un dépôt de git. Git a remplacé mes fichiers .py, mais a laissé les fichiers .pyc non suivis. Étant donné que les fichiers .py et .pyc étaient désynchronisés, la commande import dans un fichier .py n'a pas pu trouver le module correspondant dans les fichiers .pyc.

La solution consistait simplement à supprimer les fichiers .pyc et à les régénérer automatiquement.

2
répondu craq 2018-09-21 02:43:49