2012-07-28 15 views
8

Estoy tratando de entender la diferencia entre un módulo cargado y un módulo importado, si hay alguno.Python sys.modules contiene un módulo que aún no se ha importado

Estoy trabajando en Python 2.7.3, y estoy ejecutando Python desde la línea de comandos.

Si ejecuto:

import sys 
sys.modules 

obtener una lista que incluye os, por ejemplo. La documentación dice que sys.modules es una lista de módulos "cargados". Sin embargo, si trato de ejecutar algo como os.environ, obtengo un NameError que me dice que os no está definido. Sin embargo, si luego ejecuto import os, esto resuelve el problema. ¿Alguien puede explicar por qué os existe en sys.modules antes de que yo realmente importe el módulo?

+0

Abre una carcasa nueva y sigue los pasos. Publicar descripciones o, mejor aún, capturas de pantalla. El módulo os no reside en sys. –

Respuesta

9

La diferencia entre un módulo que se está importando y que se está cargando es lo que se coloca en el espacio de nombres de su módulo actual. Un módulo solo se cargará una vez (en situaciones normales), pero se puede importar muchas veces, desde diferentes lugares. Un módulo cargado puede no ser accesible en un espacio de nombres determinado, si no se ha importado allí. Por ejemplo, puede cargar un módulo sin importarlo bajo su nombre usando la sintaxis from module import name (podrá acceder al nombre especificado, pero no al módulo en sí).

Está viendo el módulo os en el diccionario sys.modules porque es utilizado internamente por el intérprete python, por lo que siempre se carga al inicio. Sin embargo, no puede acceder utilizando el nombre "os", ya que no se importa automáticamente en su espacio de nombres.

Sin embargo, puede omitir los mecanismos normales de importación de varias maneras. Por ejemplo, intente esto:

import sys 
os = sys.modules["os"] 

ahora será capaz de acceder al módulo os igual que si hubiera hecho import os.

Esto se debe a que el código es exactamente lo que hace una instrucción import cuando solicita un módulo que ya se ha cargado. Sin embargo, si prueba el código anterior con un módulo que aún no está cargado, no funcionará (obtendrá un error clave del diccionario sys.modules). La instrucción import carga nuevos módulos además de agregarlos al espacio de nombre actual. Si bien puede cargar módulos manualmente y trabajar más con el sistema de importación regular, rara vez hay una buena razón para hacerlo.

+0

¡Gracias, eso ayudó mucho! – Justin

Cuestiones relacionadas