946

使用 pip,是否可以确定当前安装了哪个版本的软件包?

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

4

16 回答 16

1358

pip 1.3开始,有一个pip show命令。

$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe

在旧版本中,pip freeze应该grep可以很好地完成这项工作。

$ pip freeze | grep Jinja2
Jinja2==2.7.3
于 2012-04-18T17:53:51.653 回答
76

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

(以光谱为例)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
于 2012-04-24T14:28:43.053 回答
52

Pip 1.3 现在还有一个list命令:

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
于 2014-01-23T10:36:22.710 回答
40

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

$ pip list --outdated
distribute (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 Jinja2
Jinja2 (Current: 2.6 Latest: 2.8)

也检查pip-toolshttps ://github.com/nvie/pip-tools

于 2014-04-30T11:00:48.963 回答
17

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

(venv)CWD> /space/vhosts/pyramid.xcode.com/venv/build/unittest 
project@pyramid 43> yolk -l
Chameleon       - 2.8.2        - active 
Jinja2          - 2.6          - active 
Mako            - 0.7.0        - active 
MarkupSafe      - 0.15         - active 
PasteDeploy     - 1.5.0        - active 
Pygments        - 1.5          - active 
Python          - 2.7.3        - active development (/usr/lib/python2.7/lib-dynload)
SQLAlchemy      - 0.7.6        - active 
WebOb           - 1.2b3        - active 
account         - 0.0          - active development (/space/vhosts/pyramid.xcode.com/project/account)
distribute      - 0.6.19       - active 
egenix-mx-base  - 3.2.3        - active 
ipython         - 0.12         - active 
logilab-astng   - 0.23.1       - active 
logilab-common  - 0.57.1       - active 
nose            - 1.1.2        - active 
pbkdf2          - 1.3          - active 
pip             - 1.0.2        - active 
pyScss          - 1.1.3        - active 
pycrypto        - 2.5          - active 
pylint          - 0.25.1       - active 
pyramid-debugtoolbar - 1.0.1        - active 
pyramid-tm      - 0.4          - active 
pyramid         - 1.3          - active 
repoze.lru      - 0.5          - active 
simplejson      - 2.5.0        - active 
transaction     - 1.2.0        - active 
translationstring - 1.1          - active 
venusian        - 1.0a3        - active 
waitress        - 0.8.1        - active 
wsgiref         - 0.1.2        - active development (/usr/lib/python2.7)
yolk            - 0.4.3        - active 
zope.deprecation - 3.5.1        - active 
zope.interface  - 3.8.0        - active 
zope.sqlalchemy - 0.7          - active 
于 2012-04-18T18:30:37.467 回答
13

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

pip show <package_name>|grep Version

例子:

pip show urllib3|grep Version

将仅显示版本。

元数据版本:2.0
版本:1.12

于 2016-01-06T18:52:46.403 回答
10

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

from importlib.metadata import version 
version('numpy')

在 python 3.8 之前:

pip install importlib-metadata 
from importlib_metadata import version
version('numpy')

bash 等价物(这里也从 python 调用)会更复杂(但更健壮 - 请参阅下面的注意事项):

import subprocess
def 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-learnnotsklearnFlask-Caching, not flask_caching

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

注意:在复杂的环境中,两种变体都可能返回令人惊讶的版本号,这与您在import.

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

$ pip freeze | grep lightgbm
lightgbm==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 年 4 月 1 日 PyPI 中可用的最新版本numpy是 1.18.0,而同时 Anaconda 的conda-forge频道只有 1.17.3 版本numpy作为最新版本。因此,当您basemap使用 conda(作为第二个)安装软件包时,您之前安装的 pipnumpy将被 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 numpy
numpy==1.18.0

$ conda list | grep numpy
numpy                     1.18.0                   pypi_0    pypi
于 2019-12-30T15:21:32.470 回答
9

还有一个名为的工具pip-check,可让您快速了解所有已安装的软件包及其更新状态:

在此处输入图像描述

自己没用过;只是偶然发现了它和这个 SO 问题,因为它没有被提及......

于 2019-02-19T03:11:33.967 回答
8

最简单的方法是这样的:

import jinja2
print jinja2.__version__
于 2015-12-30T09:27:31.303 回答
6

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

pip show setuptools | findstr "Version"

输出:

Version: 34.1.1
于 2018-02-24T05:52:35.060 回答
6

pip show 在 python 3.7 中工作:

pip show selenium
Name: selenium
Version: 4.0.0a3
Summary: Python bindings for Selenium
Home-page: https://github.com/SeleniumHQ/selenium/
Author: UNKNOWN
Author-email: UNKNOWN
License: Apache 2.0
Location: c:\python3.7\lib\site-packages\selenium-4.0.0a3-py3.7.egg
Requires: urllib3
Required-by:
于 2020-01-06T06:41:31.913 回答
4

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

使用importlib.metadata.version

蟒蛇≥3.8

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

蟒蛇≤3.7

(使用importlib_metadata.version

!pip install importlib-metadata

import importlib_metadata
importlib_metadata.version('beautifulsoup4')
'4.9.1'

使用pkg_resources.Distribution

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

归功于sinorocmirekphd的评论。

于 2020-05-30T23:40:12.597 回答
4

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

pip list --no-index --format=json | \
  jq -r '.[] | select(.name=="Jinja2").version'
# 2.10.1
于 2021-03-13T15:34:48.230 回答
0

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

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

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

在 PowerShell 中使用以下命令:

pip list | findstr <PackageName>

例子:-pip list | findstr requests

输出 :requests 2.18.4

于 2019-07-14T12:32:17.677 回答
0
import pkg_resources
packages = [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- except 块的原因是很少有库名称会因为解析库名称来处理版本而引发错误。即使 packages 变量将包含您环境中安装的所有库。

于 2020-08-06T20:59:44.487 回答
-1

对于 Windows,您可以

  1. 打开cmd,输入python,回车。

  2. 输入导入并按回车。

  3. 输入 ._version__ 并按回车键。

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

图片


于 2018-05-22T06:06:52.060 回答