2010-01-08 18 views

Respuesta

30

Los módulos de Python no se importan varias veces. Simplemente ejecutar la importación dos veces no volverá a cargar el módulo. Si desea que se vuelva a cargar, debe usar la declaración reload. He aquí una demostración

foo.py es un módulo con la sola línea

print "I am being imported" 

Y aquí está una transcripción de la pantalla de múltiples intentos de importación.

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

tenga en cuenta que 'recarga()' no solucionará cualquier referencia al módulo de edad, por lo que en realidad no es del todo útil. –

+0

Ese es un punto importante. Gracias. –

+1

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

13

Las importaciones se almacenan en caché y solo se ejecutan una vez. Las importaciones adicionales solo cuestan el tiempo de búsqueda en sys.modules.

9

Según se especifica en otras respuestas, Python general no vuelve a cargar un módulo cuando se enfrentan a una segunda instrucción de importación para ello. En cambio, devuelve su versión en caché desde sys.modules sin ejecutar ninguno de sus códigos.

Sin embargo, hay varias trampas vale la pena destacar:

  • de importar el módulo principal como un módulo ordinario efectivamente crea dos instancias del mismo módulo bajo diferentes nombres.

    Esto ocurre porque durante el inicio del programa the main module is set up with the name __main__. Por lo tanto, al importarlo como un módulo ordinario, Python no lo detecta en sys.modules y lo importa de nuevo, pero con su nombre propio la segunda vez.

    Considere el archivo /tmp/a.py con el siguiente contenido:

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

    Otro archivo /tmp/b.py tiene una sola declaración de importación de a.py (import a)
    Ejecución /tmp/a.py resultados en la siguiente salida:

    [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 
    

    Por lo tanto, lo mejor es mantener el módulo principal bastante mínima y exportación de la mayor parte de su funcionalidad a un módulo externo, tal como se aconseja here .

  • This answer especifica otros dos escenarios posibles:

    1. declaraciones de importación ligeramente diferentes que utilizan diferentes entradas en sys.path que conducen a un mismo módulo.
    2. Intento de otra importación de un módulo después de uno anterior fallido a la mitad.
+2

Esto realmente me ayudó a resolver el problema, la otra respuesta no fue completa. – Tapuzi

+1

Esto es lo que estoy buscando. Gracias. – bfrguci

Cuestiones relacionadas