使用pip,是否有可能找出当前安装的软件包的哪个版本?
我知道pip安装XYZ -升级,但我想知道是否有类似pip信息XYZ的东西。如果不是什么最好的方式来告诉我目前使用的版本。
使用pip,是否有可能找出当前安装的软件包的哪个版本?
我知道pip安装XYZ -升级,但我想知道是否有类似pip信息XYZ的东西。如果不是什么最好的方式来告诉我目前使用的版本。
当前回答
Pip 1.3现在也有一个列表命令:
$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
其他回答
在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
你也可以安装蛋黄,然后运行蛋黄-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
这里没有提到用户使用的是哪种操作系统(Windows/Linux/Mac)
因为有几个答案将完美地工作在Mac和Linux。
如果用户试图在windows上查找python包的版本,可以使用下面的命令。
在PowerShell中使用以下命令:
皮普名单| findstr < PackageName >
示例:- pip list | findstr requests
输出:请求2.18.4
我刚刚在pip中发送了一个增强的拉请求Hugo Tavares说:
(以云为例)
$ pip show specloud
Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
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返回的格式的包名,而不是导入过程中使用的格式,例如scikit-learn而不是sklearn或Flask-Caching,而不是flask_caching。
请注意,虽然在bash版本中调用pip freeze可能看起来效率不高,但只有这个方法被证明足够健壮,可以打包命名特性和不一致(例如,下划线与破破号,小写与大写,以及缩写,如sklearn与scikit-learn)。
注意:在复杂环境中,这两个变体都可能返回令人惊讶的版本号,与您在导入过程中实际得到的版本号不一致。
当用户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年04月01日,PyPI中可用的numpy的最新版本是1.18.0,而与此同时,Anaconda的conda-forge频道的numpy的最新版本只有1.17.3。因此,当您使用conda(作为第二个)安装基图包时,您之前在pip上安装的numpy将被conda降级为1.17.3,并且版本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