2010-01-08 17 views

Antwort

30

Python-Module werden nicht mehrfach importiert. Wenn Sie den Import zweimal ausführen, wird das Modul nicht erneut geladen. Wenn Sie möchten, dass es neu geladen wird, müssen Sie die reload Anweisung verwenden. Hier ist eine Demo

foo.py ist ein Modul mit der einzigen Zeile

print "I am being imported" 

Und hier ist ein Bildschirm-Transkript von mehreren Importversuchen.

>>> 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

Sie beachten Sie, dass 'reload()' werden keine Verweise auf das alte Modul reparieren, ist so nicht wirklich alles, was nützlich. –

+0

Das ist ein wichtiger Punkt. Vielen Dank. –

+1

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

13

Importe werden zwischengespeichert und nur einmal ausgeführt. Zusätzliche Importe kosten nur die Nachschlagezeit in sys.modules.

9

Wie in anderen Antworten angegeben, Python nicht nachladen im Allgemeinen kein Modul, wenn für sie eine zweite Import-Anweisung zu stoßen. Stattdessen wird die zwischengespeicherte Version von sys.modules zurückgegeben, ohne dass Code ausgeführt wird.

Allerdings gibt es einige Gefahren bemerkenswert:

  • das Hauptmodul importieren als ein gewöhnlicher Modul effektiv zwei Instanzen des gleichen Moduls unter verschiedenen Namen erstellt.

    Dies tritt auf, weil beim Programmstart the main module is set up with the name __main__. Wenn es als normales Modul importiert wird, erkennt Python es nicht in sys.modules und importiert es erneut, aber mit seinem richtigen Namen das zweite Mal herum.

    die Datei Betrachten /tmp/a.py mit folgendem Inhalt:

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

    andere Datei /tmp/b.py hat eine einzige Import-Anweisung für a.py (import a).
    Ausführen /tmp/a.py Ergebnisse in der folgenden Ausgabe:

    [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 
    

    Daher ist es am besten, das Hauptmodul ziemlich minimal und Export den größten Teil seiner Funktionalität an ein externes Modul zu halten, da here geraten .

  • This answer gibt zwei weitere mögliche Szenarien:

    1. Leicht unterschiedliche Import-Anweisungen unter Verwendung von verschiedenen Einträgen in sys.path mit dem gleichen Modul führen.
    2. Der Versuch, einen anderen Import eines Moduls nach einem vorherigen zu testen, ist auf halbem Wege fehlgeschlagen.
+2

Dies half mir tatsächlich, das Problem zu lösen, die andere Antwort war nicht vollständig. – Tapuzi

+1

Das ist, was ich suche. Vielen Dank. – bfrguci

Verwandte Themen