2017-02-17 77 views
9

Czytałem how to check if a python module has been imported i instrukcje wydają się jasne, sprawdź moduł w sys.modules. Działa to tak, jak oczekiwałem w Pythonie 2, ale nie w Pythonie 3 (testowane 3.5 i 3.6). NpDlaczego moduły, które nie zostały zaimportowane w 'sys.modules' w Pythonie 3?

Pythonie 3,6

>>> import sys 
>>> 'itertools' in sys.modules 
True 

Pythona 2,7

>>> import sys 
>>> 'itertools' in sys.modules 
False 

I zauważyć, że itertools jest opisany jako 'wbudowane' w pytonie 3 sys.modules dict (<module 'itertools' (built-in)>) i nie w Pythonie 2, więc może dlatego przed importowaniem jest w stanie sys.modules, ale jest to not listed as a built-in. W każdym razie, ponieważ itertools nadal wymaga importowania w Pythonie 3, byłbym wdzięczny za wyjaśnienie.

+4

Jeśli jakieś moduły, które już * zostały zaimportowane *, muszą zaimportować moduły własne, te moduły będą wyświetlane jako załadowane. Być może w Pythonie 3 wprowadzono zależność, która nie istniała w Pythonie 2. P.S. nawet jeśli moduł jest załadowany, musisz go "importować", aby był dostępny w bieżącym zakresie. –

+1

Myślę, że sam odpowiedziałeś na to pytanie: jeśli 'itertools' został wbudowany, zostanie załadowany zaraz po uruchomieniu interpretera. – ForceBru

+0

jest pytanie, dlaczego 'itertools' wymaga importowania lub dlaczego jest tam, a nie wymienione jako takie w dokumentacji? –

Odpowiedz

7

One mają zostały zaimportowane, tylko nie przez ciebie. Dokładnie to, które części uruchamiania interpretera spowodowały załadowanie modułu, są nieistotne szczegóły implementacji, ale można śledzić możliwe ścieżki, jeśli chcesz. Na przykład, itertools jest sprowadzane przez reprlib

from itertools import islice 

który jest sprowadzany przez functools:

from reprlib import recursive_repr 

importowanego przez types:

import functools as _functools 

importowanego przez importlib:

import types 

, która jest uruchamiana podczas uruchamiania interpretera, ponieważ tam znajduje się większość implementacji importowania.

+0

Świetnie, dziękuję za autorytatywną odpowiedź. Tak więc interpreter importuje 'itertools' (i inne moduły, takie jak' os'), ale nie dodaje ich do 'globals()', więc nie są one dostępne? –

+0

@Chris_Rands: Jest zgodny z normalnymi regułami importowania. Jeśli moduł 'foo' ma' pasek importu', to importuje tylko moduł 'bar' dostępny dla modułu' foo'. Każdy, kto chce korzystać z modułu, musi zaimportować go samodzielnie. – user2357112

+1

i dlatego nie można go znaleźć w 'Py 2', zgaduję, kiedy mechanizm importu był nadal zaimplementowany w' C' i (podobno) nie pośrednio zaimportował 'itertools'. –

-1

Wydaje się, że w Pythonie 3, rozszerzenie itertools faktycznie jest kompilowany do głównej Python binarny przeciwieństwie Pythonie 2. Jeśli do

import sys 

a następnie

'itertools' in sys.builtin_module_names 
>> True 

jest oczywiste . Wykonanie dokładnie tych samych kroków w konsoli Python 2.x daje False.

As per the docs, builtin_module_names'składa się z modułów, które są opracowane w ten Python tłumacza.

+0

, pytanie brzmi: * dlaczego * to jest, nie że tak właśnie jest. –

+0

@ JimFasarakis-Hilliard Odpowiedź na pytanie "dlaczego do itertools w sys.modules przed zaimportowaniem w Pythonie 3, a nie w Pythonie 2_" jest "ponieważ jest to wbudowane, które jest udowodnione przez jego obecność in_' builtin_module_names' ". – Anomitra

+2

Podczas gdy moduł jest kompilowany w Pythonie, takie moduły muszą zostać zainicjowane i wczytane przez import, zanim pojawią się w 'sys.modules'. – user2357112