查找使用pip安装的包的版本

使用pip,是否可以找出当前安装的包的哪个版本?

我知道pip install XYZ --upgrade,但我想知道是否有类似于pip info XYZ的东西。如果没有,告诉我当前使用的版本的最佳方法是什么。

1084331 次浏览

pip1.3开始,有一个pip show命令。

$ pip show Jinja2---Name: Jinja2Version: 2.7.3Location: /path/to/virtualenv/lib/python2.7/site-packagesRequires: markupsafe

在旧版本中,pip freezegrep应该很好地完成这项工作。

$ pip freeze | grep Jinja2Jinja2==2.7.3

您还可以安装yolk,然后运行yolk -l,这也提供了一些不错的输出。这是我为我的小虚拟环境得到的:

(venv)CWD> /space/vhosts/pyramid.xcode.com/venv/build/unittestproject@pyramid 43> yolk -lChameleon       - 2.8.2        - activeJinja2          - 2.6          - activeMako            - 0.7.0        - activeMarkupSafe      - 0.15         - activePasteDeploy     - 1.5.0        - activePygments        - 1.5          - activePython          - 2.7.3        - active development (/usr/lib/python2.7/lib-dynload)SQLAlchemy      - 0.7.6        - activeWebOb           - 1.2b3        - activeaccount         - 0.0          - active development (/space/vhosts/pyramid.xcode.com/project/account)distribute      - 0.6.19       - activeegenix-mx-base  - 3.2.3        - activeipython         - 0.12         - activelogilab-astng   - 0.23.1       - activelogilab-common  - 0.57.1       - activenose            - 1.1.2        - activepbkdf2          - 1.3          - activepip             - 1.0.2        - activepyScss          - 1.1.3        - activepycrypto        - 2.5          - activepylint          - 0.25.1       - activepyramid-debugtoolbar - 1.0.1        - activepyramid-tm      - 0.4          - activepyramid         - 1.3          - activerepoze.lru      - 0.5          - activesimplejson      - 2.5.0        - activetransaction     - 1.2.0        - activetranslationstring - 1.1          - activevenusian        - 1.0a3        - activewaitress        - 0.8.1        - activewsgiref         - 0.1.2        - active development (/usr/lib/python2.7)yolk            - 0.4.3        - activezope.deprecation - 3.5.1        - activezope.interface  - 3.8.0        - activezope.sqlalchemy - 0.7          - active

我刚刚在pip中发送了一个拉取请求,增强了Hugo Tavares说:

(以斯派洛为例)

$ pip show specloud
Package: specloudVersion: 0.4.4Requires:nosefigleafpinocchio

Pip 1.3现在也有一个列表命令:

$ pip listargparse (1.2.1)pip (1.5.1)setuptools (2.1)wsgiref (0.1.2)

并且使用--out作为额外的参数,您将获得您正在使用的包的当前和最新版本:

$ pip list --outdateddistribute (Current: 0.6.34 Latest: 0.7.3)django-bootstrap3 (Current: 1.1.0 Latest: 4.3.0)Django (Current: 1.5.4 Latest: 1.6.4)Jinja2 (Current: 2.6 Latest: 2.8)

所以结合AdamKG的回答:

$ pip list --outdated | grep Jinja2Jinja2 (Current: 2.6 Latest: 2.8)

也检查pip工具https://github.com/nvie/pip-tools

最简单的方法是:

import jinja2print jinja2.__version__

您可以使用grep命令来查找。

pip show <package_name>|grep Version

示例:

pip show urllib3|grep Version

将仅显示版本。

元数据版本:2.0
版本:1.12

在Windows上,您可以发出命令,例如:

pip show setuptools | findstr "Version"

输出:

Version: 34.1.1

对于Windows,您可以

  1. 打开cmd并键入python,按回车键。

  2. 键入导入并按回车键。

  3. 键入_version__并按回车键。

正如您在这里的屏幕截图中看到的,我正在使用这种方法来检查串行模块的版本。

图片


还有一个工具调用pip-check,它可以快速概述所有已安装的软件包及其更新状态:

在此处输入图片描述

我自己没有用过它;只是偶然发现了它,这个问题接二连三地出现了,既然没有提到……

在问题中,没有提到哪个操作系统用户正在使用(Windows/Linux /Mac)

因为有几个答案可以在Mac和Linux上完美运行。

如果用户试图在Windows上查找python包的版本,可以使用以下命令。

在PowerShell中使用以下命令:

pip list | findstr <PackageName>

示例:-pip list | findstr requests

输出:requests 2.18.4

python函数仅返回机器可读格式的包版本:

from importlib.metadata import versionversion('numpy')

在python 3.8之前:

pip install importlib-metadatafrom importlib_metadata import versionversion('numpy')

等效的bash(这里也从python调用)会复杂得多(但更健壮-请参阅下面的警告):

import subprocessdef get_installed_ver(pkg_name):bash_str="pip freeze | grep -w %s= | awk -F '==' {'print $2'} | tr -d '\n'" %(pkg_name)return(subprocess.check_output(bash_str, shell=True).decode())

样品用法:

# pkg_name="xgboost"# pkg_name="Flask"# pkg_name="Flask-Caching"pkg_name="scikit-learn"
print(get_installed_ver(pkg_name))>>> 0.22

请注意,在这两种情况下,pkg_name参数都应包含pip freeze返回的格式的包名,而不是import期间使用的格式,例如scikit-learn而不是sklearnFlask-Caching,而不是flask_caching

请注意,虽然在bash版本中调用pip freeze可能看起来效率低下,但只有这种方法被证明对包命名特性和不一致(例如下划线与破折号、小大写与大写以及缩写如sklearn vsscikit-learn)足够健壮。

注意:在复杂的环境中,两个变体都可能返回令人惊讶的版本号,与您在import期间实际获得的版本号不一致。

当包的其他版本隐藏在用户site-packages子文件夹中时,就会出现这样的问题。为了说明使用version()的危险,我遇到了这样一种情况:

$ pip freeze | grep lightgbmlightgbm==2.3.1
and
$ python -c "import lightgbm; print(lightgbm.__version__)"2.3.1
vs.
$ python -c "from importlib_metadata import version; print(version(\"lightgbm\"))"2.2.3
until you delete the subfolder with the old version (here 2.2.3) from the user folder (only one would normally be preserved by `pip` - the one installed as last with the `--user` switch):
$ ls /home/jovyan/.local/lib/python3.7/site-packages/lightgbm*/home/jovyan/.local/lib/python3.7/site-packages/lightgbm-2.2.3.dist-info/home/jovyan/.local/lib/python3.7/site-packages/lightgbm-2.3.1.dist-info

另一个问题是在同一环境中有一些conda安装的包。如果它们与您的pip安装的包共享依赖项,并且这些依赖项的版本不同,您可能会收到pip安装的依赖项的降级。

举例来说,2020年1月4日PyPI中可用的numpy的最新版本是1.18.0,而与此同时Anaconda的conda-forge频道在numpy上只有1.17.3版本作为他们的最新版本。所以当你使用conda安装basemap包(作为第二个)时,你之前pip安装的numpy将被conda降级为1.17.3,1.18.0版本将对import函数不可用。在这种情况下,version()是正确的,pip freeze/conda list错了:

$ python -c "from importlib_metadata import version; print(version(\"numpy\"))"1.17.3
$ python -c "import numpy; print(numpy.__version__)"1.17.3
$ pip freeze | grep numpynumpy==1.18.0
$ conda list | grep numpynumpy                     1.18.0                   pypi_0    pypi

pip show在python 3.7中工作:

pip show seleniumName: seleniumVersion: 4.0.0a3Summary: Python bindings for SeleniumHome-page: https://github.com/SeleniumHQ/selenium/Author: UNKNOWNAuthor-email: UNKNOWNLicense: Apache 2.0Location: c:\python3.7\lib\site-packages\selenium-4.0.0a3-py3.7.eggRequires: urllib3Required-by:

要使用Python代码执行此操作:

使用importlib.metadata.version

Python≥3.8

import importlib.metadataimportlib.metadata.version('beautifulsoup4')'4.9.1'

Python≤3.7

(使用importlib_metadata.version

!pip install importlib-metadata
import importlib_metadataimportlib_metadata.version('beautifulsoup4')'4.9.1'

使用pkg_resources.Distribution

import pkg_resourcespkg_resources.get_distribution('beautifulsoup4').version'4.9.1'pkg_resources.get_distribution('beautifulsoup4').parsed_version<Version('4.9.1')>

来自中科mirekphd的评论。

import pkg_resourcespackages = [dist.project_name for dist in pkg_resources.working_set]try:for count, item in enumerate(packages):print(item, pkg_resources.get_distribution(item).version)except:pass here

缩进可能不完美。我使用Try-除块的原因是,由于解析库名称来处理版本,很少有库名称会抛出错误。即使包变量将包含在您的环境中安装的所有库。

pip list也可以被告知将其输出格式化为json。这可能是一个更安全的方法来解析版本。

pip list --no-index --format=json | \jq -r '.[] | select(.name=="Jinja2").version'# 2.10.1