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?
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.)
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.
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
.
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
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
.
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.
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.