Найти, какая версия пакета установлена ​​вместе с pip

710

С помощью pip можно выяснить, какая версия пакета установлена ​​в данный момент?

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

Alexis
источник
4
showв pip есть предложение для команды: github.com/pypa/pip/issues/33
Уго Таварес,

Ответы:

1014

Начиная с пипа 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
оборота AdamKG
источник
8
@techtonik: это для того, чтобы заморозить текущие модули в файл require.txt .
Хьюго
@Hugo: я бы использовал saveимя.
анатолий техтоник
5
Называние «замораживание» является историческим - оно датируется как минимум 2008 годом . В то время многие люди уже были знакомы с «замораживанием» рубиновых камней, поэтому Пип заимствовал тогдашнее широко используемое имя.
AdamKG
2
это было неочевидно и не задокументировано, но вы можете напечатать, pip show pipчтобы получить информацию о версии pip, а не pip --versionкак я ожидал.
Марк Максмейстер,
pip freezeимеет преимущество в том, что корректно показывает редактируемые версии оформления VCS, а pip showне показывает .
Spookylukey
63

Я только что отправил запрос на извлечение в пипсах с улучшением, которое Уго Таварес сказал:

(как пример)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
BernardoBarreto
источник
2
Похоже, это уже объединено .
анатолий техтоник
43

Пип 1.3 теперь также имеет команду list :

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
RickyA
источник
Скажите, что имя пакета - X. Чтобы найти версию - Какая разница между использованием списка пипсов и импортом X, а затем X .__ version__? Являются ли обе версии пакета?
переменная
оба действительны, но pip listявляются общими и __version__не являются. Я тоже видел version()и get_version()для импортного.
RickyA
35

а с --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-инструменты : https://github.com/nvie/pip-tools

Kevins
источник
1
Интересный вариант. Я бы предпочел, чтобы он перечислил все из них и дал мне знать, если какой-либо из них устарел.
ArtOfWarfare
17

Вы также можете установить 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 
Gustavo
источник
9

Вы можете использовать команду grep, чтобы узнать.

pip show <package_name>|grep Version

Пример:

pip show urllib3|grep Version

покажет только версии.

Метаданные-Версия: 2.0
Версия: 1.12

Раджив
источник
8

Самый простой способ это:

import jinja2
print jinja2.__version__
user5730083
источник
7
Это работает только для пакетов, которые определены __version__в их исходном коде. Многие пакеты не делают.
Spookylukey
Рекомендуется ли включать эту версию во время упаковки или рекомендуется указывать версию только в параметре версии файла setup.py?
переменная
Этот метод также не подходит для упаковки несоответствий именования (существует как минимум 3 типа) между ожидаемым вводом importи выводом pip freeze.
Mirekphd
6

Существует также инструмент под названием, pip-checkкоторый дает вам быстрый обзор всех установленных пакетов и их статус обновления:

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

Сам не использовал его; просто наткнулся на него и этот ТАК вопрос в быстрой последовательности, и так как он не был упомянут ...

Ола Тувессон
источник
Как запустить это на Windows
Vela
1
@vela Я ожидаю, что это будет работать точно так же на Windows. Конечно, вам сначала нужно будет установить его , как в любой системе.
Ола Тувессон,
5

В Windows вы можете выполнить команду, такую ​​как:

pip show setuptools | findstr "Version"

Вывод:

Version: 34.1.1
Quinn
источник
2

Функция 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нет sklearnили Flask-Cachingнет flask_caching.

Обратите внимание, что хотя вызов pip freezeв bash-версии может показаться неэффективным, только этот метод оказывается достаточно надежным, чтобы упаковать особенности и несоответствия именования (например, подчеркивание против черточек, маленькие или большие заглавные буквы, а также сокращения, такие как sklearnпротив 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, а версия 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
mirekphd
источник
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:
Superstone
источник
Это не стандартный ответ.
Хамед Базияд
1

Для этого используйте код Python:

С помощью importlib.metadata.version

Python ≥3.8

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

Python ≤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 .

Акаменус
источник
0

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

  1. Откройте cmd и введите Python, нажмите Enter.

  2. введите импорт и нажмите ввод.

  3. введите ._version__ и нажмите ввод.

Как вы можете видеть на скриншоте здесь, я использую этот метод для проверки версии последовательного модуля.

Образ


joker2368
источник
0

В вопросе не указано, какой пользователь ОС использует (Windows / Linux / Mac)

Так как есть пара ответов, которые будут работать безупречно на Mac и Linux.

Команда ниже может быть использована в случае, если пользователь пытается найти версию пакета Python в Windows.

В PowerShell используйте следующую команду:

pip list | findstr <PackageName>

Пример:- pip list | findstr requests

Вывод : requests 2.18.4

Ашвани Сингх
источник