Zoek welke versie van het pakket is geïnstalleerd met pip

Is het mogelijk om met pip te achterhalen welke versie van een pakket momenteel is geïnstalleerd?

Ik weet van pip install XYZ --upgrademaar 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 showcommando.

$ 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 freezeen grephet 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 yolkinstalleren en dan yolk -luitvoeren, 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 
[email protected] 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-checkdie u een snel overzicht van alle geïnstalleerde pakketten en hun updatestatus:

voer hier de afbeeldingsbeschrijving in

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_namede pakketnaam moet bevatten in het formaat zoals geretourneerd door pip freezeen niet zoals gebruikt tijdens import, bijv scikit-learnniet sklearnof Flask-Caching, niet flask_caching.

Merk op dat hoewel het aanroepen van pip freezein 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 sklearnversus 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-packagessubmap. 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 numpydie 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 numpyals laatste. Dus als je een basemap-pakket met conda (als tweede) installeerde, zou je eerder pip-geïnstalleerde numpydoor 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 listfout:

$ 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 listkan 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

  1. open cmd en typ python, druk op enter.

  2. typ de import en druk op enter.

  3. 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.

Afbeelding


Other episodes