2012-07-28 9 views
8

Sto cercando di capire la differenza tra un modulo caricato e un modulo importato, se ce n'è uno.Python sys.modules contiene un modulo che non è stato ancora importato

Sto lavorando in Python 2.7.3 e sto solo eseguendo Python dalla riga di comando.

Se eseguo:

import sys 
sys.modules 

ottenere una lista che comprende os, per esempio. La documentazione dice che sys.modules è una lista di moduli "caricati". Tuttavia, se provo a eseguire qualcosa come os.environ, ottengo un NameError che mi dice che os non è definito. Tuttavia, se eseguo quindi import os, risolve il problema. Qualcuno può spiegare perché os esista in sys.modules prima che io importi effettivamente il modulo?

+0

Aprire una nuova shell e passare attraverso i passaggi. Post descrizioni o, meglio ancora, schermate. Il modulo os non risiede in sys. –

risposta

9

La differenza tra un modulo importato e in fase di caricamento è ciò che viene inserito nello spazio dei nomi del modulo corrente. Un modulo verrà caricato una sola volta (in situazioni ordinarie), ma può essere importato più volte, da molti luoghi diversi. Un modulo caricato potrebbe non essere accessibile in un determinato spazio dei nomi, se non è stato importato lì. Ad esempio, puoi caricare un modulo senza importarlo sotto il suo nome usando la sintassi from module import name (sarai in grado di accedere al nome specificato, ma non al modulo stesso).

Vedete il modulo os nel dizionario sys.modules perché è utilizzato internamente dall'interprete python e quindi è sempre caricato all'avvio. Non puoi accedervi usando il nome "os", perché non viene importato automaticamente nel tuo spazio dei nomi.

Tuttavia, è possibile ignorare i normali meccanismi di importazione in alcuni modi. Per esempio, provate questo:

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

Ora sarete in grado di accedere al modulo os proprio come se si fosse realizzato import os.

Questo perché il codice è esattamente ciò che fa un'istruzione import quando si richiede un modulo che è già stato caricato. Tuttavia, se provi il codice sopra con un modulo che non è ancora stato caricato, non funzionerà (riceverai un errore chiave dal dizionario sys.modules). L'istruzione import carica nuovi moduli oltre ad aggiungerli allo spazio dei nomi corrente. Mentre è possibile caricare manualmente i moduli e aggirare ulteriormente il normale sistema di importazione, raramente c'è una buona ragione per farlo.

+0

Grazie, è stato di grande aiuto! – Justin

Problemi correlati