Answers:
从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
save
名字。
pip show pip
以获取pip的版本信息,而不是pip --version
我期望的那样。
pip freeze
优点是可以正确显示可编辑的VCS签出版本,而pip show
不能正确显示。
我刚刚以增强的雨果·塔瓦雷斯(Hugo Tavares)的点子发送了请求请求:
(以specloud为例)
$ pip show specloud
Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
并将--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-tools:https : //github.com/nvie/pip-tools
您还可以安装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
最简单的方法是这样的:
import jinja2
print jinja2.__version__
__version__
在源代码中定义的软件包。许多软件包没有。
import
和的输出之间的命名命名不一致(至少存在3种类型)也不可靠pip freeze
。
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-learn
not sklearn
或Flask-Caching
,not flask_caching
。
请注意,虽然pip freeze
在bash版本中调用似乎效率低下,但只有这种方法被证明足够强大,可以打包命名的特殊性和不一致性(例如,下划线vs破折号,小写vs大写字母以及缩写,例如sklearn
vs 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安装的依赖关系的等级。
为了说明这一点,numpy
PyPI于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
importlib.metadata.version('NameOfProject')
?docs.python.org/3/library/…–
from importlib_metadata import version; version('Flask-Caching')
python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"
吗?
version()
仍然返回最早(最旧)的版本(2.2.3)。您可以通过使用--user
交换机安装两个版本来复制此结果,但是可以手动保留lightgbm-2.2.3.dist-info
文件夹,以将两个版本放在一起,如上所列(pip 通常会将其删除-直到没有)。
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:
为此,请使用Python代码:
importlib.metadata.version
import importlib.metadata
importlib.metadata.version('beautifulsoup4')
'4.9.1'
(使用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')>
归功于sinoroc和mirekphd的评论。
pip install
和下划线的旧版python版本的信息来增强您的性能-您可以从我的文档中逐字复制或更改numpy
为,beautifulsoup4
以保持一致性。
有问题的是,没有提到哪个OS用户正在使用(Windows / Linux / Mac)
因为有几个答案可以在Mac和Linux上完美运行。
如果用户试图在Windows上查找python软件包的版本,可以使用以下命令。
在PowerShell中,使用以下命令:
pip list | findstr <PackageName>
例:- pip list | findstr requests
输出: requests 2.18.4
show
在pip中有一个命令建议:github.com/pypa/pip/issues/33