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

Ale*_*xis 631 python pip

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

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

Ada*_*mKG 905

点子1.3开始,有一个pip show命令.

$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe
Run Code Online (Sandbox Code Playgroud)

在旧版本,pip freezegrep应做的工作很好.

$ pip freeze | grep Jinja2
Jinja2==2.7.3
Run Code Online (Sandbox Code Playgroud)

  • `pip freeze`命令名称很奇怪. (12认同)
  • @techtonik:这是[冻结当前模块](http://www.pip-installer.org/en/1.1/requirements.html)到requirements.txt. (8认同)
  • '冻结'的命名是历史性的 - 它可以追溯到[至少2008](https://github.com/pypa/pip/commit/97c152c463713bdaa0c1531a910eeae681035489#diff-65959455a7706e04f0827533ac39563bL133).当时,许多人已经熟悉了"冻结"红宝石的宝石,所以pip借用了当时广泛使用的名称. (5认同)
  • 这并不明显,也没有记载,但是您可以输入`pip show pip``来获取pip的版本信息,而不是像我期望的那样`pip --version`。 (2认同)
  • 我建议使用 -i 标志进行调用,因为您有时不知道哪些是大写字母,哪些不是:`pip freeze | grep -i xyz` (2认同)

Ber*_*ire 63

我刚刚发送了一个提取请求,其中包括增强版Hugo Tavares说:

(以specloud为例)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
Run Code Online (Sandbox Code Playgroud)

  • 看起来已经[合并](http://www.pip-installer.org/en/latest/usage.html#pip-show)。 (2认同)

Ric*_*kyA 42

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

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
Run Code Online (Sandbox Code Playgroud)


Kev*_*inS 34

并使用--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)
Run Code Online (Sandbox Code Playgroud)

所以结合AdamKG的答案:

$ pip list --outdated | grep Jinja2
Jinja2 (Current: 2.6 Latest: 2.8)
Run Code Online (Sandbox Code Playgroud)

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

  • 一个有趣的选择。我宁愿让它列出所有这些,但如果其中任何一个已经过时,请告诉我。 (2认同)

mir*_*phd 30

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

from importlib.metadata import version 
version('numpy')
Run Code Online (Sandbox Code Playgroud)

python 3.8 之前:

pip install importlib-metadata 
from importlib_metadata import version
version('numpy')
Run Code Online (Sandbox Code Playgroud)

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())
Run Code Online (Sandbox Code Playgroud)

使用示例:

# pkg_name="xgboost"
# pkg_name="Flask"
# pkg_name="Flask-Caching"
pkg_name="scikit-learn"

print(get_installed_ver(pkg_name))
>>> 0.22
Run Code Online (Sandbox Code Playgroud)

请注意,在这两种情况下,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
Run Code Online (Sandbox Code Playgroud)

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

举例来说,numpy2020 年 4 月 1 日 PyPI 中可用的最新版本是 1.18.0,而同时 Anacondaconda-forge频道的最新版本只有 1.17.3 numpy。因此,当您使用basemapconda 安装软件包(如第二个)时,您之前安装的 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
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用 importlib.metadata.version('NameOfProject')`?https://docs.python.org/3/library/importlib.metadata.html#distribution-versions (2认同)
  • 很棒的发现@sinoroc!我认为你应该将其作为答案发布,我将删除我的过度设计的答案:) 示例 PoC:`from importlib_metadata import version; 版本('Flask-Caching')` (2认同)
  • 我会让你去追求它 (2认同)

小智 18

您也可以安装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 
Run Code Online (Sandbox Code Playgroud)


小智 17

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:
Run Code Online (Sandbox Code Playgroud)


Rom*_*ain 11

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

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

  • 我第一次听说 JSON 输出。谢谢,@罗曼! (2认同)

小智 10

最简单的方法是:

import jinja2
print jinja2.__version__
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于在源代码中定义了`__version__`的包.许多包裹没有. (5认同)
  • 此方法对于“import”的预期输入和“pip freeze”的输出之间的包命名不一致(至少有 3 种类型)也不够稳健。 (2认同)

Raj*_*jiv 9

您可以使用grep命令查找.

pip show <package_name>|grep Version
Run Code Online (Sandbox Code Playgroud)

例:

pip show urllib3|grep Version
Run Code Online (Sandbox Code Playgroud)

将仅显示版本.

元数据 - 版本:2.0
版本:1.12


Acu*_*nus 8

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

\n\n

使用importlib.metadata.version

\n\n

Python \xe2\x89\xa53.8

\n\n
import importlib.metadata\nimportlib.metadata.version(\'beautifulsoup4\')\n\'4.9.1\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

Python \xe2\x89\xa43.7

\n\n

(使用importlib_metadata.version

\n\n
!pip install importlib-metadata\n\nimport importlib_metadata\nimportlib_metadata.version(\'beautifulsoup4\')\n\'4.9.1\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用pkg_resources.Distribution

\n\n
import pkg_resources\npkg_resources.get_distribution(\'beautifulsoup4\').version\n\'4.9.1\'\npkg_resources.get_distribution(\'beautifulsoup4\').parsed_version\n<Version(\'4.9.1\')>\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

感谢sinorocmirekphd的评论。

\n


Ola*_*son 7

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

在此处输入图片说明

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

  • @vela 我希望它在 Windows 上的工作原理完全相同。当然,您必须首先[安装它](https://pypi.org/project/pip-check/),就像在任何系统上一样。 (2认同)

Qui*_*inn 6

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

pip show setuptools | findstr "Version"
Run Code Online (Sandbox Code Playgroud)

输出:

Version: 34.1.1
Run Code Online (Sandbox Code Playgroud)