首页 文章

如何获取本地安装的Python模块列表?

提问于
浏览
789

我想获得一个Python模块列表,这些模块位于我的Python安装(UNIX服务器)中 .

如何获得计算机中安装的Python模块列表?

21 回答

  • 509

    从第10点开始,接受的答案将不再适用 . 开发团队已删除对 get_installed_distributions 例程的访问权限 . setuptools 中有一个替代功能,用于执行相同的操作 . 这是与pip 10一起使用的替代版本:

    import pkg_resources
    installed_packages = pkg_resources.working_set
    installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
         for i in installed_packages])
    print(installed_packages_list)
    

    如果它在以前版本的pip中有效或不可用,请告诉我 .

  • 6

    使用pkgutil.iter_modules非常简单的搜索

    from pkgutil import iter_modules
    a=iter_modules()
    while True:
        try: x=a.next()
        except: break
        if 'searchstr' in x[1]: print x[1]
    
  • -9

    有很多想法,最初我在思考这两个:

    pip

    缺点:并不总是安装

    help('modules')

    缺点:输出到控制台;破碎的模块(见ubuntu ...)可以段错误

    我需要一个简单的方法,使用基本库并兼容旧的python 2.x.

    我看到了光明:listmodules.py

    隐藏在2.5中的文档源目录中的是一个小脚本,它列出了Python安装的所有可用模块 .

    优点:

    仅使用imp,sys,os,re,设计为在Python 1.5.2上运行的时间和更新的源代码非常紧凑,因此您可以轻松地修改它,例如传递错误模块的例外列表(不要t尝试导入它们)

  • 232

    在Windows上,在cmd中输入

    c:\python\libs>python -m pip freeze
    
  • 7

    解决方案

    从Python脚本中获取类似 pip freeze 的列表,我只需50美分:

    import pip
    installed_packages = pip.get_installed_distributions()
    installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
         for i in installed_packages])
    print(installed_packages_list)
    

    作为(太长)一个班轮:

    sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
    

    赠送:

    ['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24', 
     'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3', 
     'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
     'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1', 
     'werkzeug==0.9.4']
    

    范围

    此解决方案适用于系统范围或虚拟环境范围,并涵盖由 setuptoolspip 和(god forbideasy_install 安装的软件包 .

    我的用例

    我将此调用的结果添加到我的烧瓶服务器,所以当我用 http://example.com/exampleServer/environment 调用它时,我得到服务器的virtualenv上安装的软件包列表 . 它使调试变得更加容易 .

    警告

    我注意到这种技术的奇怪行为 - 当在与 setup.py 文件相同的目录中调用Python解释器时,它不会列出由 setup.py 安装的包 .

    重现步骤:

    创建虚拟环境

    $ cd /tmp
    $ virtualenv test_env
    New python executable in test_env/bin/python
    Installing setuptools, pip...done.
    $ source test_env/bin/activate
    (test_env) $
    

    使用 setup.py 克隆git仓库

    (test_env) $ git clone https://github.com/behave/behave.git
    Cloning into 'behave'...
    remote: Reusing existing pack: 4350, done.
    remote: Total 4350 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (4350/4350), 1.85 MiB | 418.00 KiB/s, done.
    Resolving deltas: 100% (2388/2388), done.
    Checking connectivity... done.
    

    我们在 /tmp/behave 中表现为 setup.py

    (test_env) $ ls /tmp/behave/setup.py
    /tmp/behave/setup.py
    

    从git repo

    (test_env) $ cd /tmp/behave && python setup.py install
    running install
    ...
    Installed /private/tmp/test_env/lib/python2.7/site-packages/enum34-1.0-py2.7.egg
    Finished processing dependencies for behave==1.2.5a1
    

    安装python包

    如果我们从/ tmp运行上述解决方案

    >>> import pip
    >>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
    ['behave==1.2.5a1', 'enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
    >>> import os
    >>> os.getcwd()
    '/private/tmp'
    

    如果我们从/ tmp / behave运行上述解决方案

    >>> import pip
    >>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
    ['enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
    >>> import os
    >>> os.getcwd()
    '/private/tmp/behave'
    

    第二个示例中缺少 behave==1.2.5a1 ,因为工作目录包含 behavesetup.py 文件 .

    我在文档中找不到任何对此问题的引用 . 也许我会为它打开一个错误 .

  • 3

    除了使用 pip freeze ,我一直在我的虚拟环境中安装yolk .

  • 55

    pip freeze 这一切都找到了包,但是可以简单地编写以下命令来列出python包所在的所有路径 .

    >>> import site; site.getsitepackages()
    ['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
    
  • 53

    如果你安装了anaconda python distribution,你也可以使用

    $conda list
    

    除了上述解决方案 .

  • 4

    我在OS X上遇到了一个自定义安装的python 2.7 . 它需要X11来列出安装的模块(使用help和pydoc) .

    为了能够在不安装X11的情况下列出所有模块,我将pydoc作为http-server运行,即:

    pydoc -p 12345
    

    然后可以将Safari指向 http://localhost:12345/ 以查看所有模块 .

  • 69
    • ipython中,您可以输入“ import Tab” .

    • 在标准Python解释器中,您可以键入“ help('modules') ” .

    • 在命令行中,您可以使用pydoc modules .

    • 在脚本中,调用pkgutil.iter_modules() .

  • 20

    我只是用它来查看当前使用的模块:

    import sys as s
    s.modules.keys()
    

    它显示了在python上运行的所有模块 .

    对于所有内置模块,请使用:

    s.modules
    

    哪个是包含所有模块和导入对象的dict .

  • 17

    如果我们需要在Python shell中列出已安装的软件包,我们可以使用 help 命令,如下所示

    >>help('modules package')
    
  • 1

    现在,我尝试了这些方法,并且我得到了所宣传的内容:所有模块 .

    唉,你真的不太关心stdlib,你知道你用python安装得到了什么 .

    真的,我想要我安装的东西 .

    实际上,令人惊讶的是,工作得很好的是:

    pip freeze
    

    返回的是:

    Fabric==0.9.3
    apache-libcloud==0.4.0
    bzr==2.3b4
    distribute==0.6.14
    docutils==0.7
    greenlet==0.3.1
    ipython==0.10.1
    iterpipes==0.4
    libxml2-python==2.6.21
    

    我说“令人惊讶”,因为软件包安装工具是人们期望找到这个功能的确切位置,虽然不是名为'freeze'但python包装是如此奇怪,我很惊讶这个工具是有道理的 . Pip 0.8.2,Python 2.7 .

  • 10
    help('modules')
    

    在Python shell /提示符下 .

  • 7

    在正常的shell中使用

    pydoc modules
    
  • 9

    从壳

    ls site-packages
    

    如果这没有帮助,你可以这样做 .

    import sys
    import os
    for p in sys.path:
        print os.listdir( p )
    

    看看它产生了什么 .

  • 11

    从pip 1.3版开始,您就可以访问:

    pip list
    

    这似乎是“pip冻结”的语法糖 . 它将列出特定于您的安装的所有模块或virtualenv,以及他们的版本号 . 不幸的是,它没有显示任何模块的当前版本号,也没有洗碗或擦鞋 .

  • 6
    • 获取所有可用模块,运行 sys.modules

    • 获取所有已安装的模块(读取:由 pip 安装),您可以查看 pip.get_installed_distributions()

    为了第二个目的,示例代码:

    import pip
    for package in pip.get_installed_distributions():
        name = package.project_name # SQLAlchemy, Django, Flask-OAuthlib
        key = package.key # sqlalchemy, django, flask-oauthlib
        module_name = package._get_metadata("top_level.txt") # sqlalchemy, django, flask_oauthlib
        location = package.location # virtualenv lib directory etc.
        version = package.version # version number
    
  • 73

    我通常使用 pip list 来获取包列表(带有版本) .

    当然,这也适用于虚拟环境 .

  • 0

    此解决方案主要基于模块 importlibpkgutil ,并与CPython 3.4和CPython 3.5一起使用,但不支持CPython 2 .


    Explanation

    • sys.builtin_module_names - 命名所有内置模块(看我的答案here

    • pkgutil.iter_modules() - 返回有关所有可用模块的信息

    • importlib.util.find_spec() - 返回有关导入模块的信息(如果存在)

    • BuiltinImporter - 内置模块的导入程序(docs

    • SourceFileLoader - 标准Python模块的导入程序(默认情况下具有扩展名* .py)(docs

    • ExtensionFileLoader - 模块的导入程序为shared library(写在C或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

    对于CPython3.5(截断)

    $ python3.5 python_modules_info.py 
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    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*******************************)
    

    对于CPython3.4(截断)

    $ python3.4 python_modules_info.py
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    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*******************************)
    
  • 842

    如果您使用的是Python 3

    我刚试过Ubuntu,它似乎有效

    Debian / Ubuntu: sudo apt-get install python3-matplotlib

    Fedora: sudo dnf install python3-matplotlib

    红帽: sudo yum install python3-matplotlib

    拱门: sudo pacman -S python-matplotlib

    资料来源:https://matplotlib.org/users/installing.html

相关问题