2012-07-28 16 views
8

Próbuję zrozumieć różnicę między załadowanym modułem a importowanym modułem, jeśli taki istnieje.Python sys.modules zawiera moduł, który nie został jeszcze zaimportowany

Pracuję w Pythonie 2.7.3, i właśnie uruchamiam Python z wiersza poleceń.

Gdybym wykonać:

import sys 
sys.modules 

uzyskać listę, która zawiera os, na przykład. Dokumentacja mówi, że sys.modules jest listą "załadowanych" modułów. Jednak jeśli spróbuję uruchomić coś w rodzaju os.environ, otrzymuję NameError, który mówi mi, że os nie jest zdefiniowany. Jeśli jednak uruchomię teraz import os, rozwiąże to problem. Czy ktoś może wyjaśnić, dlaczego os istnieje przed faktycznym importem modułu?

+0

Otwórz zupełnie nową powłokę i przejdź przez kolejne kroki. Opisy postów lub, jeszcze lepiej, zrzuty ekranu. Moduł os nie znajduje się w systemie. –

Odpowiedz

9

Różnica między importowanym modułem i ładowaniem jest tym, co umieszcza się w obszarze nazw bieżącego modułu. Moduł zostanie załadowany tylko raz (w zwykłych sytuacjach), ale może być importowany wiele razy z wielu różnych miejsc. Załadowany moduł może nie być dostępny w danej przestrzeni nazw, jeśli nie został tam zaimportowany. Na przykład możesz załadować moduł bez importowania go pod jego nazwą, używając składni from module import name (będziesz mieć dostęp do podanej nazwy, ale nie do samego modułu).

Widzisz moduł os w słowniku sys.modules, ponieważ jest on używany wewnętrznie przez interpretera Pythona i dlatego jest zawsze ładowany podczas uruchamiania. Nie można uzyskać do niego dostępu, używając nazwy "os", ponieważ nie jest ona automatycznie importowana do przestrzeni nazw.

Można jednak obejść normalne mechanizmy importu na kilka sposobów. Na przykład, spróbuj tego:

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

Będziesz teraz mieć dostęp do modułu os tak jakbyś zrobił import os.

To dlatego, że ten kod jest dokładnie tym, co robi instrukcja import, gdy żądasz modułu, który został już załadowany. Jeśli jednak spróbujesz powyższego kodu z modułem, który nie jest jeszcze załadowany, nie zadziała (otrzymasz kluczowy błąd ze słownika sys.modules). Instrukcja import ładuje nowe moduły oprócz dodawania ich do bieżącego obszaru nazw. Chociaż możesz ręcznie ładować moduły i dalej pracować nad regularnym systemem importowania, rzadko istnieje dobry powód, aby to zrobić.

+0

Dzięki, to bardzo pomogło! – Justin

Powiązane problemy