2017-02-17 3 views
9

Я читал how to check if a python module has been imported, и инструкции кажутся ясными, проверьте модуль в sys.modules. Это работает, как я ожидал в Python 2, но не с Python 3 (3.5 и 3.6). Например:Почему модули, которые не были импортированы в 'sys.modules' в Python 3?

Python 3,6

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

Python 2,7

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

Хочу отметить, что, itertools описывается как 'встроенных' в Python 3 sys.modules dict (<module 'itertools' (built-in)>), а не в Python 2, поэтому, возможно, именно поэтому он находится в sys.modules перед импортом, но это not listed as a built-in. В любом случае, поскольку itertools все еще нуждается в импорте в Python 3, я был бы благодарен за объяснение.

+4

Если какие-либо модули, которые вы * уже импортировали, необходимо импортировать самостоятельно, эти модули будут отображаться как загруженные. Возможно, зависимость была введена в Python 3, которая не существовала в Python 2. P.S. даже если модуль загружен, вам нужно «импортировать» его, чтобы сделать его доступным в текущей области. –

+1

Я думаю, что вы сами ответили на вопрос: если 'itertools' стал встроенным, он будет загружен прямо при запуске интерпретатора. – ForceBru

+0

- это вопрос, почему 'itertools' нуждается в импорте или почему он есть и не указан как таковой в документах? –

ответ

7

У них есть были импортированы, только не вами. То, какие части запуска интерпретатора вызвали загрузку модуля, - это неважные детали реализации, но вы можете отслеживать возможные пути, если хотите. Например, itertools импортируется reprlib

from itertools import islice 

который импортируемого functools:

from reprlib import recursive_repr 

, который импортируется types:

import functools as _functools 

, который импортируется importlib:

import types 

который загружается при запуске интерпретатора, потому что именно там реализуется большая часть реализации импорта.

+0

Отлично, спасибо за авторитетный ответ. Таким образом, интерпретатор импортирует 'itertools' (и другие модули, такие как' os'), но не добавляет их в 'globals()', поэтому они недоступны? –

+0

@Chris_Rands: Он следует нормальным правилам импорта. Если модуль 'foo' делает' import bar', этот импорт только делает модуль 'bar' доступным для модуля' foo'. Каждый, кто хочет использовать модуль, должен сам импортировать его. – user2357112

+1

, и поэтому вы не можете найти его в «Py 2». Я предполагаю, что механизм импорта все еще был реализован в 'C' и (по-видимому) не косвенно импортировал' itertools'. –

-1

Оказывается, что в Python 3, расширение itertools фактически компилируется в основной двоичный Python в отличие от Python 2. Если вы делаете

import sys 

, а затем

'itertools' in sys.builtin_module_names 
>> True 

ясно , Выполнение точно таких же шагов в консоли Python 2.x приводит к False.

As per the docs, builtin_module_names состоит из 'модулей, которые собраны в этом Python интерпретатор'.

+0

вопрос * почему * это, а не что это просто. –

+0

@ JimFasarakis-Hilliard Ответ на «_why is itoolools в sys.modules перед импортом в Python 3, а не в Python 2_» - это «потому что он встроен, что подтверждается его присутствием в' builtin_module_names' ». – Anomitra

+2

Хотя модуль действительно скомпилирован в Python, такие модули все еще нужно инициализировать и загружать импортом где-нибудь, прежде чем они появятся в 'sys.modules'. – user2357112

Смежные вопросы