如何在 Python 中列出所有已安装的包及其版本?

Posted

技术标签:

【中文标题】如何在 Python 中列出所有已安装的包及其版本?【英文标题】:How to list all installed packages and their versions in Python? 【发布时间】:2012-10-08 01:04:40 【问题描述】:

在 Python 中有没有办法列出所有已安装的包及其版本?

我知道我可以进入python/Lib/site-packages 并查看存在哪些文件和目录,但我觉得这很尴尬。我正在寻找类似于npm list 的东西,即npm-ls。

【问题讨论】:

How can I get a list of locally installed Python modules?的可能重复 【参考方案1】:

如果你有 pip install 并且你想看看你的安装工具安装了哪些包,你可以简单地调用这个:

pip freeze

它还将包括已安装软件包的版本号。

更新

pip 已更新为通过调用产生与pip freeze 相同的输出:

pip list

注意

pip list 的输出格式不同,所以如果你有一些 shell 脚本可以解析freeze 的输出(可能是为了获取版本号)并且想要更改你的脚本来调用list,你'将需要更改您的解析代码。

【讨论】:

恕我直言,他们应该提供pip list 作为pip freeze 的别名。写 pip freeze > requirements.txt 很直观,但不是 pip freeze 哇:刚刚查看了最新版本的 pip 的文档,似乎他们已经添加了 pip list:pip-installer.org/en/latest/usage.html#pip-list - 所以这实际上已经出现了!【参考方案2】:

help('modules') 应该为你做。

在 IPython 中:

In [1]: import                      #import press-TAB
Display all 631 possibilities? (y or n)
ANSI                   audiodev               markupbase
AptUrl                 audioop                markupsafe
ArgImagePlugin         avahi                  marshal
BaseHTTPServer         axi                    math
Bastion                base64                 md5
BdfFontFile            bdb                    mhlib
BmpImagePlugin         binascii               mimetools
BufrStubImagePlugin    binhex                 mimetypes
CDDB                   bisect                 mimify
CDROM                  bonobo                 mmap
CGIHTTPServer          brlapi                 mmkeys
Canvas                 bsddb                  modulefinder
CommandNotFound        butterfly              multifile
ConfigParser           bz2                    multiprocessing
ContainerIO            cPickle                musicbrainz2
Cookie                 cProfile               mutagen
Crypto                 cStringIO              mutex
CurImagePlugin         cairo                  mx
DLFCN                  calendar               netrc
DcxImagePlugin         cdrom                  new
Dialog                 cgi                    nis
DiscID                 cgitb                  nntplib
DistUpgrade            checkbox               ntpath

【讨论】:

这很方便!不过,我也很想看到这些版本。 我认为问题在于没有标准化的方式来包含版本......有时它的 Package.version()package.__version__package.ver 或任何数量的其他可能性 我认为 python 的座右铭是“只有一种方法可以做到”;) ? @EdRandall,不-这是“一种明显的方法”。总有一种不明显的方式。此外,确切的措辞是:应该有一种——最好只有一种——明显的方式来做到这一点。虽然这种方式一开始可能并不明显,除非你是荷兰人。【参考方案3】:

如果您想获取有关已安装的 python 发行版的信息并且不想使用您的 cmd 控制台或终端,而是通过 python 代码,您可以使用以下代码(使用 python 3.4 测试):

import pip #needed to use the pip functions
for i in pip.get_installed_distributions(local_only=True):
    print(i)

pip.get_installed_distributions(local_only=True) 函数调用返回一个 iterable,并且由于 for 循环和 print 函数,包含在 iterable 中的元素被打印出来,并用换行符分隔 (\n)。 结果将(取决于您安装的发行版)如下所示:

cycler 0.9.0
decorator 4.0.4
ipykernel 4.1.0
ipython 4.0.0
ipython-genutils 0.1.0
ipywidgets 4.0.3
Jinja2 2.8
jsonschema 2.5.1
jupyter 1.0.0
jupyter-client 4.1.1
#... and so on...

【讨论】:

要扩展 @exhuma 的评论,您应该使用 pip 10:import pkg_resources [print(d.project_name) for d in pkg_resources.working_set] pkg_resources 的状态如何? AFAICR 这是setuptools 的一部分。不是pip。我们能否安全地假设setuptools 将始终可用,仅取决于pip【参考方案4】:

从命令行

python -c help('modules')

可用于查看所有模块,以及针对特定模块

python -c help('os')

对于下面的 Linux 将有效

python -c "help('os')"

【讨论】:

这适用于 Windows。在 linux 上它会抛出错误:-bash: syntax error near unexpected token `(' 这不提供模块版本 在 Linux 上,这必须是:python -c "help('modules')"【参考方案5】:

要在更高版本的 pip(在 pip==10.0.1 上测试)中运行它,请使用以下命令:

from pip._internal.operations.freeze import freeze
for requirement in freeze(local_only=True):
    print(requirement)

【讨论】:

internal 的状态是什么?。我看到了pydoc pip._internal,但我在help(pip._internal)、pip.__builtins_ 等下无法访问它。pip 参考指南也是空白的。 不幸的是我不知道。我也不喜欢它被称为_internal。该功能似乎没有正式公开。所以你应该小心处理!【参考方案6】:

我的看法:

#!/usr/bin/env python3

import pkg_resources

dists = [str(d).replace(" ","==") for d in pkg_resources.working_set]
for i in dists:
    print(i)

【讨论】:

你不能只做[d.project_name for d in pkg_resources.working_set]吗? @TomClose 不,因为这不会打印已安装包的版本【参考方案7】:

你可以试试:蛋黄

要安装蛋黄,请尝试:

easy_install yolk

Yolk 是一个 Python 工具,用于获取有关已安装 Python 的信息 PyPI 上可用的包和查询包(Python 包 索引)。

您可以查看哪些软件包处于活动状态、非活动状态或正在开发中 模式并通过查询向您显示哪些有更新的版本可用 PyPI。

【讨论】:

此时我通常使用 pip 执行此任务,但我有一个非常老的项目,我还没有准备好添加分发到其中,我记得那里有一个这样的工具。不记得叫什么了……就是这个! 它不支持python 3(刚刚从pip安装并出现运行时错误)【参考方案8】:

是的!你应该使用 pip 作为你的 python 包管理器(http://pypi.python.org/pypi/pip)

用 pip 安装包,你可以做一个

pip freeze

它会列出所有已安装的软件包。您可能还应该使用virtualenv 和virtualenvwrapper。当你开始一个新项目时,你可以这样做

mkvirtualenv my_new_project

然后(在那个 virtualenv 中),做

pip install all_your_stuff

这样,您可以workon my_new_project 然后pip freeze 来查看为该虚拟环境/项目安装了哪些软件包。

例如:

➜  ~  mkvirtualenv yo_dude
New python executable in yo_dude/bin/python
Installing setuptools............done.
Installing pip...............done.
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/get_env_details

(yo_dude)➜  ~  pip install django
Downloading/unpacking django
  Downloading Django-1.4.1.tar.gz (7.7Mb): 7.7Mb downloaded
  Running setup.py egg_info for package django

Installing collected packages: django
  Running setup.py install for django
    changing mode of build/scripts-2.7/django-admin.py from 644 to 755

    changing mode of /Users/aaylward/dev/virtualenvs/yo_dude/bin/django-admin.py to 755
Successfully installed django
Cleaning up...

(yo_dude)➜  ~  pip freeze
Django==1.4.1
wsgiref==0.1.2

(yo_dude)➜  ~  

或者如果你有一个带有 requirements.pip 文件的 python 包,

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

会成功的

【讨论】:

哦,是的,我实际上已经使用 virtualenv 一段时间了。我只是不知道我怎么不知道我可以这样使用pip 关于virtualenv与全局站点包,则需要使用pip list --local @johntex 你不应该使用全局站点包! 使用全局站点包非常有用。如果不是,则virtualenv 中根本不存在该选项。我不知道有什么理由不使用它们,如果你愿意,没有人阻止你限制为孤立的virtualenv 不使用它们的一个重要原因是,当您分发或部署您的应用程序或程序时,其他人/服务器不会拥有您的全局站点包。如果您是唯一使用该应用程序的人,请随心所欲。【参考方案9】:

这是一种使用 PYTHONPATH 而不是 python 库目录的绝对路径的方法:

for d in `echo "$PYTHONPATH" | tr ':' '\n'`; do ls "$d"; done

[ 10:43 Jonathan@MacBookPro-2 ~/xCode/Projects/Python for ios/trunk/Python for iOS/Python for iOS ]$ for d in `echo "$PYTHONPATH" | tr ':' '\n'`; do ls "$d"; done
libpython2.7.dylib pkgconfig          python2.7
BaseHTTPServer.py      _pyio.pyc              cgitb.pyo              doctest.pyo            htmlentitydefs.pyc     mimetools.pyc          plat-mac               runpy.py               stringold.pyc          traceback.pyo
BaseHTTPServer.pyc     _pyio.pyo              chunk.py               dumbdbm.py             htmlentitydefs.pyo     mimetools.pyo          platform.py            runpy.pyc              stringold.pyo          tty.py
BaseHTTPServer.pyo     _strptime.py           chunk.pyc              dumbdbm.pyc            htmllib.py             mimetypes.py           platform.pyc           runpy.pyo              stringprep.py          tty.pyc
Bastion.py             _strptime.pyc          chunk.pyo              dumbdbm.pyo            htmllib.pyc            mimetypes.pyc          platform.pyo           sched.py               stringprep.pyc         tty.pyo
Bastion.pyc            _strptime.pyo          cmd.py
....

【讨论】:

【参考方案10】:

如果您使用的是 anaconda:

conda list

会做的!见:https://conda.io/docs/_downloads/conda-cheatsheet.pdf

【讨论】:

或者在 jupyter notebook 中,进入 New > Terminal 并在终端输入:pip list【参考方案11】:

如果需要在 python 中运行,你可以调用 subprocess

from subprocess import PIPE, Popen

pip_process = Popen(["pip freeze"], stdout=PIPE,
                   stderr=PIPE, shell=True)
stdout, stderr = pip_process.communicate()
print(stdout.decode("utf-8"))

【讨论】:

【参考方案12】:

用于使用代码,例如检查 Hackerrank 中的哪些模块等:

import os
os.system("pip list")

【讨论】:

以上是关于如何在 Python 中列出所有已安装的包及其版本?的主要内容,如果未能解决你的问题,请参考以下文章

Python及R安装包版本查看方法

python [使用代码安装pip包]使用此脚本使用nothin而不是python代码安装python包,并列出已安装的包#

怎么查看python中已安装的包

python如何获取电脑已安装字体列表

linux中怎样查看已安装的软件

Meteor:如何列出已安装的软件包