Question

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 lance a.py, je reçois:

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

Qu'est-ce que l'erreur? Comment puis-je résoudre ce problème?

Était-ce utile?

La solution

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

Si vous devez vraiment avoir les 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()

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

(À première vue, il pourrait 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 se fait seulement la première fois. La seconde fois consécutive, vous importez un module, c'est une opération rapide.)

Autres conseils

Je l'ai aussi vu cette erreur en nommant, par inadvertance, un module avec le même nom que l'un des modules Python standard. Par exemple. J'ai eu un module appelé commands qui est également un module bibliothèque Python. Cela se est avéré difficile à traquer comme cela 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. les importations de a b et les importations de b a. Mais l'un d'entre eux doit être chargé en premier -. Dans ce cas python finit par l'initialisation du module avant a b et b.hi() n'existe pas encore lorsque vous essayez d'y accéder à a

Je suis cette erreur en faisant référence à un ENUM qui a été importé d'une manière erronée, par exemple:.

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

correcte importation:

from package.MyEnumClass import MyEnumClass

L'espoir qui aide quelqu'un

J'ai vécu cette erreur, car le module n'a pas été effectivement importées. 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é lieu à un AttributeError. La cause était que j'avais pas remarqué que les sous-modules de a (a.b et a.c) étaient explicitement importés, et a supposé que la déclaration de import a effectivement importées.

Toutes les réponses ci-dessus sont grands, mais je voudrais sonner ici. Si vous ne détectez une question mentionnée ci-dessus, essayez éclaircir votre environnement de travail. Il a travaillé pour moi.

Je suis tombé sur ce problème quand j'ai vérifié une ancienne version d'un référentiel à partir git. Git a remplacé mes fichiers .py, mais a laissé les fichiers .pyc trassez. Étant donné que les fichiers et les fichiers .py .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 était tout simplement de supprimer les fichiers .pyc, et laissez-les être régénérées automatiquement.

Je fait face à la même question. fixée à l'aide de reload.

import the_module_name
from importlib import reload
reload(the_module_name)

Je ne sais pas comment, mais le changement ci-dessous triée mon problème:

J'avais le nom du fichier et le nom d'importation même pour, par exemple, j'ai eu le nom de fichier comme emoji.py et je cherchais à importer emoji. Mais changer le nom du fichier a résolu le problème.

Hope il aide

importations circulaires causer des problèmes, mais Python a des moyens d'en atténuer les effets intégrés.

Le problème est lorsque vous exécutez python a.py, il fonctionne a.py mais pas marquer les données importées en tant que module. Donc, en a.py tour -> b importations Module -> Module importations a -> b Module importations. La dernière importation d'un no-op puisque b est actuellement importé et gardes Python contre cela. Et b est un module vide pour l'instant. Alors, quand il exécute b.hi(), il ne peut pas trouver quoi que ce soit.

Notez que le b.hi() qui a obtenu exécuté est pendant a.py -> Module b -.> Module a, non a.py directement

Dans votre exemple précis, vous pouvez simplement exécuter python -c 'import a' au plus haut niveau, de sorte que la première exécution de a.py est enregistrée en tant que l'importation d'un module.

@ md5 pour moi, Essayez de changer le nom du module ou importer directement la fonction

ubuntu 18,04 ( virtualenv , python.3.6.x ), les reload extrait résolu le problème pour moi:

main.py

import my_module  # my_modyle.py
from importlib import reload # reload 
reload(my_module)

print(my_module)
print(my_modeule.hello())

où:

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

pour plus Documentation vérifier: ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top