web-dev-qa-db-fra.com

Essayer d'importer un module avec le même nom qu'un module intégré provoque une erreur d'importation

J'ai un module qui entre en conflit avec un module intégré. Par exemple, un myapp.email module défini dans myapp/email.py.

Je peux référencer myapp.email n'importe où dans mon code sans problème. Cependant, je dois référencer le module de messagerie intégré à partir de mon module de messagerie.

# myapp/email.py
from email import message_from_string

Il se trouve seulement, et lève donc un ImportError, puisque myapp.email n'a pas de message_from_string méthode. import email provoque le même problème lorsque j'essaie email.message_from_string.

Existe-t-il un support natif pour le faire en Python, ou suis-je obligé de renommer mon module "e-mail" en quelque chose de plus spécifique?

67
Cory

Vous voudrez en savoir plus sur Importations absolues et relatives qui résout ce problème. Utilisation:

from __future__ import absolute_import

En utilisant cela, tout nom de package sans fioritures fera toujours référence au package de niveau supérieur. Vous devrez ensuite utiliser les importations relatives (from .email import ...) pour accéder à votre propre package.

REMARQUE: Ce qui précède from ... la ligne doit être placée dans un 2.x Python .py fichiers au-dessus de import ... lignes que vous utilisez. Dans Python 3.x, c'est le comportement par défaut et n'est donc plus nécessaire.

93
Greg Hewgill