2011-02-04 3 views
5

Je fais des tâches d'initialisation quand un module est chargé pour la première fois. Le problème est que, d'une façon ou d'une autre, il est importé deux fois, et je n'arrive pas à comprendre pourquoi. Je pensais que ce pourrait être importé en utilisant le chemin différent, comme dans cet exemple:Module importé plusieurs fois

a.py:

from apps.blog import models 
... 

b.py:

from blog import models 
... 

-je insérer print __name__ dans mon module, et imprimé deux fois, ce qui fait que le problème ne se situe pas dans les chemins d'importation.
Alors, y a-t-il une autre raison pour qu'un module soit importé plusieurs fois?

MISE À JOUR: Je n'ai pas mentionné que j'utilise django. Je pense que ce problème est lié au script manage.py de django: https://docs.djangoproject.com/en/dev/releases/1.4/#updated-default-project-layout-and-manage-py

+0

Pour toute autre personne qui aurait eu cette erreur, j'ai trouvé le mien était dû à une tentative d'importer des dossiers de parents, ne pas utiliser ' ..' mais en utilisant 'sys.path.append (os.path.abspath (os.path.join (os.path.dirname (__ fichier__), os.path.pardir)))' – Aesthete

Répondre

8

Normalement, Python ne doit pas importer un module deux fois sans tenir compte des références absolues/relatives. Il est probable que Python voit le fichier source sous la forme de deux fichiers différents et les importe donc séparément. Cela peut arriver en raison de fichiers/répertoires symétriques, ou de versions différentes côte-à-côte, ou de répertoires qui se chevauchent dans PYTHONPATH, c'est difficile à dire.

Une façon de suivre cette baisse est d'utiliser le débogueur interactif. Ajoutez une ligne import pdb; pdb.set_trace() au niveau supérieur de votre fichier et, dans le shell interactif, entrez bt pour obtenir une trace indiquant la chaîne d'importation. Continuez avec c. Lorsque le fichier est importé une deuxième fois et que le débogueur est activé, essayez à nouveau bt et comparez les deux sorties, ce qui peut révéler le problème.

+4

Une procédure plus simple consiste à simplement simuler un échec de l'importation (erreur de syntaxe ou toute exception au moment de l'importation), ce qui permettra à Python d'imprimer une traceback. –

+0

Veuillez le poster comme une réponse distincte afin que nous puissions l'améliorer correctement. –

+0

exception au moment de l'importation me donnerait traceback seulement sur la première importation –

Questions connexes