2010-01-08 4 views

Répondre

30

Les modules Python ne sont pas importés plusieurs fois. L'exécution de l'importation deux fois ne rechargera pas le module. Si vous voulez qu'il soit rechargé, vous devez utiliser l'instruction reload. Voici une démo

foo.py est un module avec la seule ligne

print "I am being imported" 

Et voici une transcription d'écran de multiples tentatives d'importation.

>>> import foo 
    Hello, I am being imported 
    >>> import foo # Will not print the statement 
    >>> reload(foo) # Will print it again 
    Hello, I am being imported 
+7

Notez que la 'reload()' ne réparer toutes les références à l'ancien module, est donc pas vraiment tout ce qui utile. –

+0

C'est un point important. Merci. –

+1

Références: http://docs.python.org/tutorial/modules.html#more-on-modules. http://docs.python.org/reference/simple_stmts.html#the-import-statement –

13

Les importations sont mises en cache et ne sont exécutées qu'une seule fois. Les importations supplémentaires ne coûtent que le temps de recherche en sys.modules.

9

Comme spécifié dans d'autres réponses, Python ne généralement pas recharger un module lorsqu'il rencontre une deuxième instruction d'importation pour elle. Au lieu de cela, il renvoie la version en cache de sys.modules sans exécuter le code.

Cependant il y a plusieurs pièges à noter:

  • Importation du module principal en tant que module ordinaire crée effectivement deux instances du même module sous différents noms.

    Cela se produit car pendant le démarrage du programme the main module is set up with the name __main__. Ainsi, lors de l'importation en tant que module ordinaire, Python ne le détecte pas dans sys.modules et l'importe de nouveau, mais avec son nom propre la deuxième fois.

    Considérez le fichier /tmp/a.py avec le contenu suivant:

    # /tmp/a.py 
    import sys 
    
    print "%s executing as %s, recognized as %s in sys.modules" % (__file__, __name__, sys.modules[__name__]) 
    import b 
    

    Un autre fichier /tmp/b.py a une seule déclaration d'importation pour a.py (import a).
    exécution /tmp/a.py résultats dans la sortie suivante:

    [email protected]:/tmp$ python a.py 
    a.py executing as __main__, recognized as <module '__main__' from 'a.py'> in sys.modules 
    /tmp/a.pyc executing as a, recognized as <module 'a' from '/tmp/a.pyc'> in sys.modules 
    

    Par conséquent, il est préférable de garder le module principal assez minimal et l'exportation plupart de ses fonctionnalités à un module externe, comme conseillé here .

  • This answer spécifie deux scénarios possibles: plus

    1. déclarations d'importation légèrement différentes en utilisant différentes entrées dans sys.path conduisant au même module.
    2. Tentative d'importation d'un module après l'échec d'un précédent à mi-parcours.
+2

Cela m'a aidé à résoudre le problème, l'autre réponse n'était pas complète. – Tapuzi

+1

C'est ce que je cherche. Merci. – bfrguci