Знайдіть, яка версія пакета встановлена ​​за допомогою pip


708

Використовуючи pip, чи можна зрозуміти, яка версія пакета зараз встановлена?

Я знаю про, pip install XYZ --upgradeале мені цікаво, чи є щось подібне pip info XYZ. Якщо ні, то що було б найкращим способом сказати, яку версію я зараз використовую.


4
є пропозиція щодо showкоманди в pip: github.com/pypa/pip/isissue/33
Уго Таварес

Відповіді:


1012

Станом на 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

8
@techtonik: Це для заморожування поточних модулів до вимог.txt .
Гюго

@Hugo: Я б використав saveім'я.
anatoly techtonik

5
Названня «заморожування» є історичним - воно починається щонайменше з 2008 року . У той час багато людей вже були знайомі з «заморожуючими» рубіновими дорогоцінними каменями, тому піп запозичив тоді широко поширену назву.
AdamKG

2
це не було очевидно і не було задокументовано, але ви можете набрати інформацію, pip show pipщоб отримати інформацію про версію файлу, а не pip --versionяк я очікував.
Марк Максмайстер

pip freezeмає перевагу в тому, що він коректно показує редаговані версії для оформлення замовлення VCS, а pip showні.
spookylukey


43

Pip 1.3 тепер також має команду списку :

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)

Скажіть, ім'я пакету - X. Щоб знайти версію - Яка різниця між використанням списку піп-файлів та імпортом X, а потім X .__ версія__? Є обидві версії пакету?
змінна

обидва є дійсними, але pip listє загальними, і __version__ні. Я також бачив version()і get_version()для імпортного.
RickyA

35

а з додатком - оновленим як додатковий аргумент, ви отримаєте Поточну та останню версії пакетів, які ви використовуєте:

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

Перевірте також піп-інструменти : https://github.com/nvie/pip-tools


1
Цікавий варіант. Я вважаю за краще, щоб він перерахував їх усі, і, можливо, дайте мені знати, чи хтось із них застарів.
ArtOfWarfare

17

Ви також можете встановити yolkта запустити, yolk -lщо також дає хороший вихід. Ось що я отримую за свій маленький віртуаленв:

(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 

9

Ви можете скористатися командою grep, щоб дізнатися це.

pip show <package_name>|grep Version

Приклад:

pip show urllib3|grep Version

покажуть лише версії.

Версія метаданих:
Версія 2.0 : 1.12


8

Найпростіший спосіб:

import jinja2
print jinja2.__version__

7
Це працює лише для пакетів, визначених __version__у їх вихідному коді. Багато пакетів цього не роблять.
spookylukey

Чи корисно включати цю версію під час упаковки чи корисною є версія лише в параметрі версії файла setup.py?
змінна

Цей метод також не є надійним для невідповідностей іменування пакетів (існує щонайменше 3 типи) між очікуваним введенням importта виходом pip freeze.
mirekphd

6

Існує також інструмент,pip-check який називається, який дає вам швидкий огляд усіх встановлених пакетів та їх статусу оновлення:

введіть тут опис зображення

Я не використовував його сам; просто наткнувся на це та це питання ТАК швидко, а про нього не згадували ...


Як запустити це на вікнах
Вела

1
@vela Я сподіваюся, що він буде працювати точно так само в Windows. Звичайно, спочатку вам доведеться встановити його , як і в будь-якій системі.
Ола Тувессон

5

У Windows можна видавати такі команди, як:

pip show setuptools | findstr "Version"

Вихід:

Version: 34.1.1

2

Функція python, що повертає лише версію пакета в машиночитаному форматі:

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

До пітона 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НЕ sklearnабо Flask-Caching, що неflask_caching .

Зауважте, що хоча виклик pip freezeу версії bash може здатися неефективним, лише цей метод виявляється достатньо надійним щодо особливостей та невідповідностей іменування пакету (наприклад, підкреслення проти тире, малих та великих букв та скорочень, таких як sklearnvsscikit-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, тоді як в той же час conda-forgeканал Anaconda мав лише останню версію 1.17.3 numpy. Отже, коли ви встановили basemapпакет з conda (як другий), ваш попередньо встановлений pip numpyзменшиться на conda до 1.17.3, а версія 1.18.0 стане недоступною для importфункції. У цьому випадку 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

1
Чому б не використовувати importlib.metadata.version('NameOfProject')? docs.python.org/3/library/…
sinoroc

1
Чудова знахідка @sinoroc! Я думаю, ви повинні опублікувати це як відповідь, і я видалю свою досить переосмислену :) Приклад PoC: from importlib_metadata import version; version('Flask-Caching')
mirekphd

1
Я відпущу вас на це
sinoroc

Ваші новітні зміни мене дивують. Чи можете ви спробувати python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"?
sinoroc

Ця відповідь дає правильну відповідь - останню версію, встановлену (2.3.1), коли version()все-таки повертається найдавніша (найстаріша) версія (2.2.3). Ви можете скопіювати цей результат, встановивши обидві версії за допомогою --userперемикача, але зберігши вручну lightgbm-2.2.3.dist-infoпапку, щоб обидві вони були разом, як зазначено вище (pip, як правило, видаляє її, доки вона не стане ).
mirekphd

1

піп-шоу працює в 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:

Це не стандартна відповідь.
hamed baziyad

1

Для цього використовуйте код Python:

Використання importlib.metadata.version

Пітон ≥3,8

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

Пітон ≤3,7

(за допомогою 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 .


Правильно, об'єднання двох відповідей було б, мабуть, найкращим для громади. Оскільки ваша більш лаконічна і не втекла до удару жодного разу, ви, ймовірно, можете покращити свою інформацію інформацією про застарілі версії python, що потребують a pip installта підкреслення - ви можете скопіювати її дослівно з моєї або змінити numpyна beautifulsoup4послідовну.
mirekphd

0

Для Windows ви можете

  1. відкрийте cmd і введіть python, натисніть клавішу Enter.

  2. введіть імпорт та натисніть клавішу Enter.

  3. введіть ._version__ і натисніть клавішу Enter.

Як ви бачите на знімку екрана, я використовую цей метод для перевірки версії серійного модуля.

Зображення



0

Питання не зазначається, який користувач ОС використовує (Windows / Linux / Mac)

Оскільки є кілька відповідей, які працюватимуть бездоганно на Mac та Linux.

Команда нижче може бути використана у випадку, якщо користувач намагається знайти версію пакету python у Windows.

У PowerShell використовуйте команду нижче:

pip list | findstr <PackageName>

Приклад: - pip list | findstr requests

Вихід: requests 2.18.4

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.