查找pip安装了哪个版本的软件包


708

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

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


4
show在pip中有一个命令建议:github.com/pypa/pip/issues/33
Hugo Tavares

Answers:


1012

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 freezegrep应做的工作很好。

$ pip freeze | grep Jinja2
Jinja2==2.7.3

8
@techtonik:用于将当前模块冻结到requirements.txt。
雨果

@Hugo:我会用save名字。
anatoly techtonik 2014年

5
“冻结”的命名是历史悠久的- 至少可以追溯到2008年。当时,许多人已经熟悉“冷冻”红宝石宝石,因此pip借用了当时广泛使用的名称。
AdamKG

2
这不是很明显,也没有记录,但是您可以键入pip show pip以获取pip的版本信息,而不是pip --version我期望的那样。
马克·麦克斯梅斯特

pip freeze优点是可以正确显示可编辑的VCS签出版本,而pip show不能正确显示。
spookylukey '16

63

我刚刚以增强的雨果·塔瓦雷斯(Hugo Tavares)的点子发送了请求请求:

(以specloud为例)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

2
看起来已经合并了。
anatoly techtonik

43

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

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)

假设软件包名称为X。要查找版本-使用点子列表与先导入X然后再进行X .__ version__有什么区别?都是软件包版本吗?
变量

两者都是有效的,但是pip list是通用的,__version__不是。我也看到了version()get_version()进口的。
RickyA

35

并将--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


1
一个有趣的选择。我希望它列出所有这些,但是让我知道它们是否已过时。
ArtOfWarfare 2014年

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 

9

您可以使用grep命令进行查找。

pip show <package_name>|grep Version

例:

pip show urllib3|grep Version

将仅显示版本。

元数据版本:2.0
版本:1.12


8

最简单的方法是这样的:

import jinja2
print jinja2.__version__

7
这仅适用于__version__在源代码中定义的软件包。许多软件包没有。
spookylukey '16

打包时包含此版本是一种好习惯,还是在setup.py文件的version参数中仅包含该版本是个好习惯?
变量

此方法对于封装的预期输入import和的输出之间的命名命名不一致(至少存在3种类型)也不可靠pip freeze
mirekphd


5

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

pip show setuptools | findstr "Version"

输出:

Version: 34.1.1

2

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-learnnot sklearnFlask-Caching,not flask_caching

请注意,虽然pip freeze在bash版本中调用似乎效率低下,但只有这种方法被证明足够强大,可以打包命名的特殊性和不一致性(例如,下划线vs破折号,小写vs大写字母以及缩写,例如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安装的依赖关系的等级。

为了说明这一点,numpyPyPI于04-01-2020 上提供的最新版本是1.18.0,与此同时,Anaconda的conda-forge频道仅提供了1.17.3版本numpy。因此,当您basemap使用conda(第二个)安装软件包时,先前pip安装的numpy版本将被conda降级为1.17.3,并且该import功能无法使用1.18.0版本。在这种情况下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

1
为什么不使用importlib.metadata.version('NameOfProject')docs.python.org/3/library/…–
sinoroc

1
很棒@sinoroc!我认为您应该将其发布为答案,并且我将删除我设计from importlib_metadata import version; version('Flask-Caching')
过度的

1
我让你努力去做
sinoroc

您最新的编辑使我感到惊讶。你可以试试python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"吗?
sinoroc

那会给您正确的答案-安装的最新版本(2.3.1),version()仍然返回最早(最旧)的版本(2.2.3)。您可以通过使用--user交换机安装两个版本来复制此结果,但是可以手动保留lightgbm-2.2.3.dist-info文件夹,以将两个版本放在一起,如上所列(pip 通常会将其删除-直到没有)。
mirekphd

1

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:

这不是标准答案。
hamed baziyad

1

为此,请使用Python代码:

使用 importlib.metadata.version

Python≥3.8

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

Python≤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的评论。


是的,将这两个答案结合起来可能最适合社区。由于您的脚本更加简洁,甚至没有逃脱过一次bash,因此您可以使用需要a pip install和下划线的旧版python版本的信息来增强您的性能-您可以从我的文档中逐字复制或更改numpy为,beautifulsoup4以保持一致性。
mirekphd

0

对于Windows,您可以

  1. 打开cmd并键入python,然后按Enter。

  2. 键入导入,然后按Enter。

  3. 输入._version__并按Enter。

如您在此处的屏幕快照中所见,我正在使用此方法检查串行模块的版本。

图片



0

有问题的是,没有提到哪个OS用户正在使用(Windows / Linux / Mac)

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

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

在PowerShell中,使用以下命令:

pip list | findstr <PackageName>

例:- pip list | findstr requests

输出: requests 2.18.4

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.