Znajdź, która wersja pakietu jest zainstalowana z pipem

708

Używając pip, czy można dowiedzieć się, która wersja pakietu jest obecnie zainstalowana?

Wiem o tym, pip install XYZ --upgradeale zastanawiam się, czy jest coś takiego pip info XYZ. Jeśli nie, jaki byłby najlepszy sposób, aby powiedzieć, jakiej wersji aktualnie używam.

Alexis
źródło
4
showw pip jest propozycja polecenia: github.com/pypa/pip/issues/33
Hugo Tavares

Odpowiedzi:

1012

Począwszy od pip 1.3 istnieje pip showpolecenie.

$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe

W starszych wersjach pip freezei greppowinien dobrze wykonywać pracę.

$ pip freeze | grep Jinja2
Jinja2==2.7.3
AdamKG
źródło
8
@techtonik: Służy do zamrażania obecnych modułów zgodnie z wymaganiami.txt.
Hugo
@ Hugo: Użyłbym savenazwy.
anatoly techtonik
5
Nazwa „zamrożenie” jest historyczna - pochodzi z co najmniej 2008 roku . W tym czasie wiele osób znało już „zamrażanie” rubinowych klejnotów, więc pip zapożyczył powszechnie używaną wówczas nazwę.
AdamKG
2
nie było to oczywiste ani udokumentowane, ale możesz wpisać, pip show pipaby uzyskać informacje o wersji pipa, a nie pip --versiontak, jak się spodziewałam.
Marc Maxmeister,
pip freezema tę zaletę, że wyświetla poprawnie edytowalne wersje kasy VCS, podczas gdy pip shownie.
spookylukey
63

Właśnie wysłałem żądanie ściągnięcia w pip z ulepszeniem Hugo Tavares powiedział:

(zaznacz jako przykład)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
BernardoBarreto
źródło
2
Wygląda na to, że jest już scalony .
anatoly techtonik
43

Pip 1.3 ma teraz także polecenie listy :

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
RickyA
źródło
Powiedz, że nazwa pakietu to X. Aby znaleźć wersję - Jaka jest różnica między używaniem listy pip i wykonywaniem importu X, a następnie X .__ wersja__? Czy obie wersje pakietu?
zmienna
oba są poprawne, ale pip listsą ogólne i __version__nie są. Widziałem także version()i get_version()za importowany jeden.
RickyA
35

a wraz z --outdated jako dodatkowy argument otrzymasz aktualne i najnowsze wersje używanych pakietów:

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

Łącząc się z odpowiedzią AdamKG:

$ pip list --outdated | grep Jinja2
Jinja2 (Current: 2.6 Latest: 2.8)

Sprawdź też narzędzia pip : https://github.com/nvie/pip-tools

KevinS
źródło
1
Ciekawa opcja. Wolałbym, żeby wymienił je wszystkie i dałbym znać, jeśli któreś z nich są nieaktualne.
ArtOfWarfare
17

Możesz także zainstalować, yolka następnie uruchomić, yolk -lco daje również niezły wynik. Oto, co dostaję dla mojego małego wirtualnego:

(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 
Gustavo
źródło
9

Aby to sprawdzić, możesz użyć polecenia grep.

pip show <package_name>|grep Version

Przykład:

pip show urllib3|grep Version

pokaże tylko wersje.

Wersja metadanych: 2.0
Wersja: 1.12

Rajiv
źródło
8

Najłatwiej jest to zrobić:

import jinja2
print jinja2.__version__
użytkownik5730083
źródło
7
Działa to tylko w przypadku pakietów, które mają zdefiniowane __version__w kodzie źródłowym. Wiele pakietów nie.
spookylukey
Czy dobrą praktyką jest dołączanie tej wersji podczas pakowania, czy dobrą praktyką jest posiadanie wersji tylko w parametrze wersji pliku setup.py?
zmienna
Ta metoda również nie jest odporna na spakowanie niespójności nazewnictwa (istnieją co najmniej 3 typy) między oczekiwanym wejściem importa wyjściem pip freeze.
mirekphd
6

Istnieje również narzędzie o nazwie, pip-checkktóre daje szybki przegląd wszystkich zainstalowanych pakietów i ich statusu aktualizacji:

wprowadź opis zdjęcia tutaj

Sam go nie użyłem; po prostu natknąłem się na to i to SO pytanie w krótkim czasie, a ponieważ nie zostało wspomniane ...

Ola Tuvesson
źródło
Jak uruchomić to w
systemie
1
@vela Oczekuję, że będzie działać dokładnie tak samo w systemie Windows. Oczywiście najpierw musisz go zainstalować , tak jak w każdym systemie.
Ola Tuvesson
5

W systemie Windows możesz wydać polecenie takie jak:

pip show setuptools | findstr "Version"

Wynik:

Version: 34.1.1
Quinn
źródło
2

Funkcja python zwraca tylko wersję pakietu w formacie do odczytu maszynowego:

from importlib.metadata import version 
version('numpy')

Przed Pythonem 3.8:

pip install importlib-metadata 
from importlib_metadata import version
version('numpy')

Odpowiednik bash (tutaj również wywoływany z Pythona) byłby znacznie bardziej złożony (ale bardziej solidny - patrz uwaga poniżej):

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())

Przykładowe użycie:

# pkg_name="xgboost"
# pkg_name="Flask"
# pkg_name="Flask-Caching"
pkg_name="scikit-learn"

print(get_installed_ver(pkg_name))
>>> 0.22

Zauważ, że w obu przypadkach pkg_nameparametr powinien zawierać nazwę pakietu w formacie zwróconym przez pip freezei nie używanym podczas import, np. scikit-learnNie sklearnlub Flask-Cachingnie flask_caching.

Zauważ, że chociaż wywoływanie pip freezew wersji bash może wydawać się nieefektywne, tylko ta metoda okazuje się wystarczająco odporna na pakowanie osobliwości i niespójności nazewnictwa (np. Podkreślenia w porównaniu z myślnikami, małe i duże wielkie litery oraz skróty, takie jak sklearnvs scikit-learn).

Uwaga: w złożonych środowiskach oba warianty mogą zwracać niespodziewane numery wersji, niespójne z tym, co faktycznie można uzyskać podczas import.

Jeden z takich problemów pojawia się, gdy w podfolderze użytkownika są ukryte inne wersje pakietu site-packages. Jako ilustrację niebezpieczeństw związanych z korzystaniem version()z tej sytuacji napotkałem:

$ 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

Innym problemem jest posiadanie niektórych pakietów instalowanych w tym samym środowisku. Jeśli współużytkują zależności z pakietami zainstalowanymi przez pip, a wersje tych zależności różnią się, możesz uzyskać obniżenie poziomu zależności zainstalowanych przez pip.

Aby to zilustrować, najnowsza wersja numpydostępna w PyPI w dniu 04-01-2020 to 1.18.0, podczas gdy w tym samym czasie conda-forgekanał Anacondy miał tylko wersję 1.17.3 numpyjako najnowszą. Kiedy więc zainstalujesz basemappakiet z conda (jako drugi), poprzednio zainstalowany pip numpyzostanie obniżony z wersji conda do 1.17.3, a wersja 1.18.0 stanie się niedostępna dla tej importfunkcji. W takim przypadku version()byłoby dobrze i pip freeze/ conda listźle:

$ 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
mirekphd
źródło
1
Dlaczego nie użyć importlib.metadata.version('NameOfProject')? docs.python.org/3/library/…
sinoroc
1
Świetne znalezisko @sinoroc! Myślę, że powinieneś opublikować to jako odpowiedź, a ja usunę mój raczej niezoptymalizowany :) Próbka PoC: from importlib_metadata import version; version('Flask-Caching')
mirekphd
1
Pozwolę ci odejść
sinoroc
Twoje najnowsze zmiany mnie zaskakują. Możesz spróbować python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"?
sinoroc
Ta daje prawidłową odpowiedź - najnowszą zainstalowaną wersję (2.3.1), gdy version()nadal zwraca najwcześniejszą (najstarszą) wersję (2.2.3). Możesz powtórzyć ten wynik, instalując obie wersje za pomocą --userprzełącznika, ale ręcznie zachowując lightgbm-2.2.3.dist-infofolder, aby oba były razem, jak pokazano powyżej (pip normalnie usuwałby go - dopóki tego nie zrobi).
mirekphd
1

Pokaż pip działa w Pythonie 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:
Superstone
źródło
To nie jest standardowa odpowiedź.
Hamed Baziyad
1

Aby to zrobić za pomocą kodu Python:

Za pomocą importlib.metadata.version

Python ≥3,8

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

Python ≤ 3,7

(za pomocą importlib_metadata.version)

!pip install importlib-metadata

import importlib_metadata
importlib_metadata.version('beautifulsoup4')
'4.9.1'

Za pomocą 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')>

Podziękowania dla komentarzy sinoroc i mirekphd .

Acumenus
źródło
Tak, połączenie dwóch odpowiedzi byłoby prawdopodobnie najlepsze dla społeczności. Ponieważ twój jest bardziej zwięzły i nie uciekł do bash jeszcze raz, prawdopodobnie mogłaby zwiększyć swoje z informacją o starszych wersjach Pythona wymagających pip installi podkreślenia - można skopiować go dosłownie z kopalni lub zmiany numpydo beautifulsoup4zachowania spójności.
mirekphd
0

W systemie Windows możesz

  1. otwórz cmd i wpisz python, naciśnij enter.

  2. wpisz import i naciśnij enter.

  3. wpisz ._version__ i naciśnij enter.

Jak widać na zrzucie ekranu tutaj, używam tej metody do sprawdzenia wersji modułu szeregowego.

Wizerunek


joker2368
źródło
0

W pytaniu nie wspomniano, którego użytkownika systemu operacyjnego używa (Windows / Linux / Mac)

Ponieważ istnieje kilka odpowiedzi, które będą działać bezbłędnie na komputerach Mac i Linux.

Poniższej komendy można użyć w przypadku, gdy użytkownik próbuje znaleźć wersję pakietu python w systemie Windows.

W PowerShell użyj poniższego polecenia:

pip list | findstr <PackageName>

Przykład:- pip list | findstr requests

Wynik : requests 2.18.4

Ashwani Singh
źródło