Is het mogelijk om met pip te achterhalen welke versie van een pakket momenteel is geïnstalleerd?
Ik weet van pip install XYZ --upgrade
maar ik vraag me af of er zoiets bestaat als pip info XYZ
. Zo niet, wat is dan de beste manier om te zien welke versie ik momenteel gebruik.
Antwoord 1, autoriteit 100%
Vanaf pip 1.3is er een pip show
commando.
$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe
In oudere versies zouden pip freeze
en grep
het werk goed moeten doen.
$ pip freeze | grep Jinja2
Jinja2==2.7.3
Antwoord 2, autoriteit 6%
Ik heb zojuist een pull-verzoek in pip gestuurd met de verbetering die Hugo Tavares zei:
(specloud als voorbeeld)
$ pip show specloud
Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
Antwoord 3, autoriteit 4%
Pip 1.3 heeft nu ook een list-opdracht:
$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
Antwoord 4, autoriteit 3%
en met –outdated als extra argument, krijg je de huidige en nieuwste versies van de pakketten die je gebruikt :
$ 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)
Dus gecombineerd met het antwoord van AdamKG :
$ pip list --outdated | grep Jinja2
Jinja2 (Current: 2.6 Latest: 2.8)
Controleer ook pip-tools: https://github.com/nvie/pip-tools
Antwoord 5
Je kunt ook yolk
installeren en dan yolk -l
uitvoeren, wat ook een mooie output geeft. Dit is wat ik krijg voor mijn kleine 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
Antwoord 6
Je kunt het grep-commando gebruiken om erachter te komen.
pip show <package_name>|grep Version
Voorbeeld:
pip show urllib3|grep Version
geeft alleen de versies weer.
Metadata-versie: 2.0
Versie: 1.12
Antwoord 7
De gemakkelijkste manier is als volgt:
import jinja2
print jinja2.__version__
Antwoord 8
Er is ook een toolgenaamd pip-check
die u een snel overzicht van alle geïnstalleerde pakketten en hun updatestatus:
Ik heb het zelf niet gebruikt; kwam het net tegen en deze SO-vraag snel achter elkaar, en aangezien het niet werd genoemd…
Antwoord 9
In Windows kun je commando’s geven zoals:
pip show setuptools | findstr "Version"
Uitvoer:
Version: 34.1.1
Antwoord 10
Om dit te doen met Python-code:
Met behulp van importlib.metadata.version
Python ≥3.8
import importlib.metadata
importlib.metadata.version('beautifulsoup4')
'4.9.1'
Python ≤3.7
(met behulp van importlib_metadata.version
)
!pip install importlib-metadata
import importlib_metadata
importlib_metadata.version('beautifulsoup4')
'4.9.1'
Met behulp van 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')>
Met dank aan opmerkingen van sinorocen mirekphd.
Antwoord 11
De python-functie retourneert alleen de pakketversie in een machineleesbaar formaat:
from importlib.metadata import version
version('numpy')
Vóór python 3.8:
pip install importlib-metadata
from importlib_metadata import version
version('numpy')
Het bash-equivalent (hier ook aangeroepen vanuit python) zou veel complexer zijn (maar robuuster – zie waarschuwing hieronder):
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())
Voorbeeldgebruik:
# pkg_name="xgboost"
# pkg_name="Flask"
# pkg_name="Flask-Caching"
pkg_name="scikit-learn"
print(get_installed_ver(pkg_name))
>>> 0.22
Merk op dat in beide gevallen de parameter pkg_name
de pakketnaam moet bevatten in het formaat zoals geretourneerd door pip freeze
en niet zoals gebruikt tijdens import
, bijv scikit-learn
niet sklearn
of Flask-Caching
, niet flask_caching
.
Merk op dat hoewel het aanroepen van pip freeze
in bash-versie inefficiënt lijkt, alleen deze methode voldoende robuust blijkt te zijn om eigenaardigheden en inconsistenties in naamgeving te verpakken (bijv. underscores vs streepjes, small vs large caps en afkortingen zoals sklearn
versus scikit-learn
).
Let op: in complexe omgevingen kunnen beide varianten verrassende versienummers retourneren, in strijd met wat u daadwerkelijk kunt krijgen tijdens import
.
Een dergelijk probleem doet zich voor wanneer er andere versies van het pakket verborgen zijn in een gebruikersite-packages
submap. Ter illustratie van de gevaren van het gebruik van version()
is hier een situatie die ik tegenkwam:
$ 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
Een ander probleem is het hebben van door conda geïnstalleerde pakketten in dezelfde omgeving. Als ze afhankelijkheden delen met uw pip-geïnstalleerde pakketten, en versies van deze afhankelijkheden verschillen, kunt u downgrades krijgen van uw pip-geïnstalleerde afhankelijkheden.
Ter illustratie: de nieuwste versie van numpy
die beschikbaar was in PyPI op 01-04-2020 was 1.18.0, terwijl tegelijkertijd Anaconda’s conda-forge
-kanaal alleen versie 1.17.3 op numpy
als laatste. Dus als je een basemap
-pakket met conda (als tweede) installeerde, zou je eerder pip-geïnstalleerde numpy
door conda worden gedowngraded naar 1.17.3, en versie 1.18.0 zou niet meer beschikbaar zijn voor de functie import
. In dit geval heeft version()
gelijk, en pip freeze
/conda list
fout:
$ 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
Antwoord 12
pip show werkt in 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:
Antwoord 13
Er wordt niet vermeld welk besturingssysteem de gebruiker gebruikt (Windows/Linux/Mac)
Omdat er een paar antwoorden zijn die perfect werken op Mac en Linux.
Het onderstaande commando kan worden gebruikt als de gebruiker de versie van een python-pakket op Windows probeert te vinden.
Gebruik in PowerShell onderstaande opdracht:
pip list | findstr <PackageName>
Voorbeeld:- pip list | findstr requests
Uitvoer: requests 2.18.4
Antwoord 14
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
De inspringingen zijn mogelijk niet perfect. De reden dat ik een Try- Except-blok gebruik, is dat maar weinig bibliotheeknamen fouten zullen veroorzaken vanwege het ontleden van de bibliotheeknamen om de versies te verwerken. ook al bevat de variabele packages alle bibliotheken die in uw omgeving zijn geïnstalleerd.
Antwoord 15
pip list
kan ook worden gevraagd om de uitvoer op te maken als json
.
Het zou een veiligere manier kunnen zijn om de versie te ontleden.
pip list --no-index --format=json | \
jq -r '.[] | select(.name=="Jinja2").version'
# 2.10.1
Antwoord 16
Voor Windows kunt u
-
open cmd en typ python, druk op enter.
-
typ de import en druk op enter.
-
typ ._version__ en druk op enter.
Zoals je kunt zien in de screenshot hier, gebruik ik deze methode om de versie van de seriële module te controleren.