Quantcast
Viewing all articles
Browse latest Browse all 35

Answer by PADYMKO for How do I get a list of locally installed Python modules?

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

  1. sys.builtin_module_names - names all built-in modules (look my answer here)
  2. pkgutil.iter_modules() - returns an information about all available modules
  3. importlib.util.find_spec() - returns an information about importing module, if exists
  4. BuiltinImporter - an importer for built-in modules (docs)
  5. SourceFileLoader - an importer for a standard Python module (by default has extension *.py) (docs)
  6. 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*******************************)

Viewing all articles
Browse latest Browse all 35

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>