How can I get a list of locally installed Python modules?

前端 未结 30 2639
庸人自扰
庸人自扰 2020-11-22 04:32

I would like to get a list of Python modules, which are in my Python installation (UNIX server).

How can you get a list of Python modules installed in your computer?

30条回答
  •  深忆病人
    2020-11-22 05:09

    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 sys
    import os
    import shutil
    import pkgutil
    import importlib
    import collections
    
    if 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 CPython3.5 (truncated)

    $ python3.5 python_modules_info.py 
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    30: 
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    _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: 
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    __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: 
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    _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 CPython3.4 (truncated)

    $ python3.4 python_modules_info.py
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    54: 
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    _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: 
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    __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: 
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    _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*******************************)
    

提交回复
热议问题