This solution is primary based on modules importlib
and pkgutil
and work with CPython 3.4 and CPython 3.5, but has no support for the CPython 2.
Explanation
sys.builtin_module_names
- names all built-in modules (look my answer here)pkgutil.iter_modules()
- returns an information about all available modulesimportlib.util.find_spec()
- returns an information about importing module, if existsBuiltinImporter
- an importer for built-in modules (docs)SourceFileLoader
- an importer for a standard Python module (by default has extension *.py) (docs)ExtensionFileLoader
- an importer for modules as shared library (written on the C or C++)
Full code
import sysimport osimport shutilimport pkgutilimport importlibimport collectionsif sys.version_info.major == 2: raise NotImplementedError('CPython 2 is not supported yet')def main(): # Name this file (module) this_module_name = os.path.basename(__file__).rsplit('.')[0] # Dict for loaders with their modules loaders = collections.OrderedDict() # Names's of build-in modules for module_name in sys.builtin_module_names: # Find an information about a module by name module = importlib.util.find_spec(module_name) # Add a key about a loader in the dict, if not exists yet if module.loader not in loaders: loaders[module.loader] = [] # Add a name and a location about imported module in the dict loaders[module.loader].append((module.name, module.origin)) # All available non-build-in modules for module_name in pkgutil.iter_modules(): # Ignore this module if this_module_name == module_name[1]: continue # Find an information about a module by name module = importlib.util.find_spec(module_name[1]) # Add a key about a loader in the dict, if not exists yet loader = type(module.loader) if loader not in loaders: loaders[loader] = [] # Add a name and a location about imported module in the dict loaders[loader].append((module.name, module.origin)) # Pretty print line = '-' * shutil.get_terminal_size().columns for loader, modules in loaders.items(): print('{0}\n{1}: {2}\n{0}'.format(line, len(modules), loader)) for module in modules: print('{0:30} | {1}'.format(module[0], module[1]))if __name__ == '__main__': main()
Usage
For the CPython 3.5 (truncated)
python3.5 python_modules_info.py
Output:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------30: <class '_frozen_importlib.BuiltinImporter'>------------------------------------------------------------------------------------------------------------------------------------------------------------------------_ast | built-in_codecs | built-in_collections | built-in_functools | built-in_imp | None_io | built-in_locale | built-in_operator | built-in_signal | built-in_sre | built-in_stat | built-in_string | built-in_symtable | built-in_thread | built-in(****************************truncated*******************************)------------------------------------------------------------------------------------------------------------------------------------------------------------------------227: <class '_frozen_importlib_external.SourceFileLoader'>------------------------------------------------------------------------------------------------------------------------------------------------------------------------__future__ | /usr/local/lib/python3.5/__future__.py_bootlocale | /usr/local/lib/python3.5/_bootlocale.py_collections_abc | /usr/local/lib/python3.5/_collections_abc.py_compat_pickle | /usr/local/lib/python3.5/_compat_pickle.py_compression | /usr/local/lib/python3.5/_compression.py_dummy_thread | /usr/local/lib/python3.5/_dummy_thread.py_markupbase | /usr/local/lib/python3.5/_markupbase.py_osx_support | /usr/local/lib/python3.5/_osx_support.py_pydecimal | /usr/local/lib/python3.5/_pydecimal.py_pyio | /usr/local/lib/python3.5/_pyio.py_sitebuiltins | /usr/local/lib/python3.5/_sitebuiltins.py(****************************truncated*******************************)------------------------------------------------------------------------------------------------------------------------------------------------------------------------64: <class '_frozen_importlib_external.ExtensionFileLoader'>------------------------------------------------------------------------------------------------------------------------------------------------------------------------_bisect | /usr/local/lib/python3.5/lib-dynload/_bisect.cpython-35m-x86_64-linux-gnu.so_bz2 | /usr/local/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so_codecs_cn | /usr/local/lib/python3.5/lib-dynload/_codecs_cn.cpython-35m-x86_64-linux-gnu.so_codecs_hk | /usr/local/lib/python3.5/lib-dynload/_codecs_hk.cpython-35m-x86_64-linux-gnu.so_codecs_iso2022 | /usr/local/lib/python3.5/lib-dynload/_codecs_iso2022.cpython-35m-x86_64-linux-gnu.so(****************************truncated*******************************)
For the CPython 3.4 (truncated)
python3.4 python_modules_info.py
Output:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------54: <class '_frozen_importlib.BuiltinImporter'>------------------------------------------------------------------------------------------------------------------------------------------------------------------------_ast | built-in_bisect | built-in_codecs | built-in_collections | built-in_datetime | built-in_elementtree | built-in_functools | built-in_heapq | built-in_imp | None_io | built-in_locale | built-in_md5 | built-in_operator | built-in_pickle | built-in_posixsubprocess | built-in_random | built-in(****************************truncated*******************************)------------------------------------------------------------------------------------------------------------------------------------------------------------------------246: <class '_frozen_importlib.SourceFileLoader'>------------------------------------------------------------------------------------------------------------------------------------------------------------------------__future__ | /usr/lib/python3.4/__future__.py_bootlocale | /usr/lib/python3.4/_bootlocale.py_collections_abc | /usr/lib/python3.4/_collections_abc.py_compat_pickle | /usr/lib/python3.4/_compat_pickle.py_dummy_thread | /usr/lib/python3.4/_dummy_thread.py_markupbase | /usr/lib/python3.4/_markupbase.py_osx_support | /usr/lib/python3.4/_osx_support.py_pyio | /usr/lib/python3.4/_pyio.py(****************************truncated*******************************)------------------------------------------------------------------------------------------------------------------------------------------------------------------------44: <class '_frozen_importlib.ExtensionFileLoader'>------------------------------------------------------------------------------------------------------------------------------------------------------------------------_bz2 | /usr/lib/python3.4/lib-dynload/_bz2.cpython-34m-x86_64-linux-gnu.so_codecs_cn | /usr/lib/python3.4/lib-dynload/_codecs_cn.cpython-34m-x86_64-linux-gnu.so_codecs_hk | /usr/lib/python3.4/lib-dynload/_codecs_hk.cpython-34m-x86_64-linux-gnu.so_codecs_iso2022 | /usr/lib/python3.4/lib-dynload/_codecs_iso2022.cpython-34m-x86_64-linux-gnu.so_codecs_jp | /usr/lib/python3.4/lib-dynload/_codecs_jp.cpython-34m-x86_64-linux-gnu.so_codecs_kr | /usr/lib/python3.4/lib-dynload/_codecs_kr.cpython-34m-x86_64-linux-gnu.so_codecs_tw | /usr/lib/python3.4/lib-dynload/_codecs_tw.cpython-34m-x86_64-linux-gnu.so_crypt | /usr/lib/python3.4/lib-dynload/_crypt.cpython-34m-x86_64-linux-gnu.so(****************************truncated*******************************)