help("modules")
может занять много времени, потому что он должен импортировать каждый модуль, прежде чем сможет искать путь к этому модулю для подмодулей. Это может быть проблемой, если какой-либо модуль имеет код за пределами защиты if __name__ == "__main__":
, и если этот код ожидает ввода данных пользователем, входит в бесконечный цикл или зависает по любой другой причине.
Под капотом help("modules")
вызывает pkgutil.walk_packages
, что демонстрирует вышеупомянутое поведение «импортировать все». В качестве альтернативы вы можете вызвать iter_modules
, который не импортирует все, с недостатком только итерации модулей верхнего уровня.
>>> import pkgutil
>>> print [tup[1] for tup in pkgutil.iter_modules()]
['colorama', 'xlrd', 'BeautifulSoup', 'BeautifulSoupTests', '_ctypes', ...
#snip...
..., 'pywin', 'win32ui', 'win32uiole']
Это также упустит некоторые встроенные модули, которые вы можете получить отдельно, используя sys
.
>>> import sys
>>> sys.builtin_module_names
('__builtin__', '__main__', '_ast', '_bisect', '_codecs', ...
#snip...
..., 'thread', 'time', 'xxsubtype', 'zipimport', 'zlib')