имя модуля в sys.modules и globals () - PullRequest
9 голосов
/ 19 августа 2011

Если я импортирую модуль, имя модуля отображается в sys.modules и globals(). Если я снова удаляю его, он удаляется из globals(), но все еще находится в sys.modules. Почему это так?

import mymodule
'mymodule' in globals()   # True
'mymodule' in sys.modules # True
del mymodule
'mymodule' in globals()   # False
'mymodule' in sys.modules # Still True, why?

Я также обнаружил следующую разницу:

from mypackage import mymodule
'mypackage' in sys.modules            # True
'mymodule'  in sys.modules            # False !
'mypackage.mymodule' in sys.modules   # also True !

, в то время как ответы являются дополнительными для globals():

'mypackage' in sys.modules            # False
'mymodule'  in sys.modules            # True 
'mypackage.mymodule' in sys.modules   # False

Ответы [ 3 ]

4 голосов
/ 19 августа 2011

Как и любой другой объект Python, модуль продолжает существовать до тех пор, пока на него больше не будет ссылок.Другими словами, sys.modules ведет себя как обычный dict, а

import mymodule
lst = {mymodule.__name__: mymodule}
'mymodule' in globals()   # True
'mymodule' in lst         # True
del mymodule
'mymodule' in globals()   # False
'mymodule' in lst         # Still True

sys.modules используется только для операторов импорта.Вы можете удалить модуль из sys.modules, чтобы Python перезагрузил его при следующем импортировании.

4 голосов
/ 19 августа 2011

del убирает привязку имени в соответствующей области; это не имеет ничего общего с модулями как таковыми.

sys.modules хранит список всех загруженных модулей, независимо от того, связаны ли они с каким-либо именем в вашей программе.

3 голосов
/ 19 августа 2011

Поскольку Python кэширует модули в sys.modules, чтобы предотвратить (дорогой, медленный) процесс поиска модулей, выполняющийся дольше, чем необходимо.

Можно удалить модуль изsys.modules если вам нужно, хотя reload также может работать.


Более подробно, когда вы import mymodule происходят разные вещи.Вдобавок ко мне, и предполагая, что mymodule не является одним из модулей, встроенных в исполняемый файл интерпретатора:

  1. Интерпретатор запускает некоторый сложный код, чтобы найти файл, содержащий mymodule (это может быть mymodule.py, mymodule.pyc или mymodule.pyd - или, может быть, что-то еще, о чем я не подумал. Это просматривает текущий каталог, sys.path и другие места тоже.

  2. Расположенный таким образом файл лексируется, анализируется и компилируется (при необходимости) в байт-коды интерпретатора.

  3. Скомпилированный модуль выполняется, давая модульobject.

  4. Объект модуля вставлен в sys.modules.

  5. Объект модуля привязан к локальной переменной, указанной в import утверждение.

(Выше приведено очень грубое приближение, основанное на том, что я помню о механике, стоящей за import. Это, вероятно, неправильно в важных и тонких отношениях.)

Обратите внимание, что привязка объекта модуля к locНа самом деле, имя является довольно малой частью реального процесса импорта.Удаление привязки имени путем выполнения del mymodule не влияет на остальную часть импорта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...