среда, 26 декабря 2012 г.

Рецептики: Определить все загруженные модули

Спросили на ответах Гугла. Не мудрствуя лукаво, нашел решение на stackoverflow.com и сделал его немного более pythonic:
import types
imports = dict((name, val) for name, val in globals().items() if isinstance(val, types.ModuleType))

На Python 2.7 можно немного изящнее:
import types
imports = {name: val for name, val in globals().items() if isinstance(val, types.ModuleType)}

Однако видим пример влияния измерительного инструмента на измеряемую величину, всегда грузится дополнительный модуль types, который также и показывается. Нужен он только для получения типа модуля types.ModuleType. А определен ModuleType прямо таки примитивно (я сразу догадался :)
import sys
ModuleType = type(sys)

И тут мы вспоминаем, что у нас всегда есть загруженный магический модуль __builtins__, и ничего не мешает его использовать:
imports = {name: val for name, val in globals().items() if isinstance(val, type(__builtins__))}

Теперь совсем хорошо!