¿Cómo evitar que un módulo se importe dos veces?

Al escribir módulos de Python, ¿hay alguna forma de evitar que los códigos de los clientes los importen dos veces? Al igual que los archivos de cabecera c / c ++:

#ifndef XXX #define XXX ... #endif 

¡Muchas gracias!

Los módulos de Python no se importan varias veces. Simplemente ejecutando la importación dos veces no se volverá a cargar el módulo. Si desea que se reload a cargar, debe utilizar la instrucción reload . Aquí hay una demostración

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

 print "I am being imported" 

Y aquí hay una transcripción de pantalla de múltiples bashs 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 

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 .

Como se especifica en otras respuestas, Python generalmente no vuelve a cargar un módulo cuando encuentra una segunda statement de importación para él. En su lugar, devuelve su versión en caché de sys.modules sin ejecutar ninguno de sus códigos.

Sin embargo, hay varios escollos que vale la pena señalar:

  • La importación del módulo principal como un módulo ordinario crea efectivamente dos instancias del mismo módulo con nombres diferentes.

    Esto ocurre porque durante el inicio del progtwig, el módulo principal se configura con el nombre __main__ . Por lo tanto, al importarlo como un módulo normal, 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 statement de importación para a.py ( import a ).
    La ejecución de /tmp/a.py da como resultado el siguiente resultado:

     root@machine:/tmp$ python a.py a.py executing as __main__, recognized as  in sys.modules /tmp/a.pyc executing as a, recognized as  in sys.modules 

    Por lo tanto, es mejor mantener el módulo principal bastante mínimo y exportar la mayor parte de su funcionalidad a un módulo externo, como se recomienda aquí .

  • Esta respuesta especifica dos posibles escenarios más:

    1. Instrucciones de importación ligeramente diferentes que utilizan diferentes entradas en sys.path conducen al mismo módulo.
    2. Intentar otra importación de un módulo después de un error anterior a la mitad.