12

Узнать, какая версия пакета установлена с помощью pip

10

Как узнать установленную версию пакета с помощью pip?

Я использую pip для управления пакетами Python и хотел бы узнать, как можно определить, какая версия конкретного пакета в настоящее время установлена на моем компьютере.

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

5 ответ(ов)

0

Вы можете дать свой отзыв на запрос на извлечение (pull request) в pip с улучшением по примеру, который привел Хуго Таварес. В данном случае вы можете использовать следующую команду, чтобы отобразить информацию о пакете specloud:

$ pip show specloud

Команда выведет следующую информацию:

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

Это позволит вам увидеть, какая версия пакета установлена, и какие дополнительные зависимости требуются для его работы. Если у вас есть другие вопросы или нужны уточнения, не стесняйтесь задавать их!

0

Если вы используете --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-tools: https://github.com/nvie/pip-tools.

0

Для получения версии пакета в формате, удобном для машинного чтения, в Python можно использовать следующий код:

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

Если вы используете Python версии до 3.8, вам потребуется установить пакет importlib-metadata:

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. Вот пример, с которым я столкнулся:

$ pip freeze | grep lightgbm
lightgbm==2.3.1

и

$ python -c "import lightgbm; print(lightgbm.__version__)"
2.3.1

по сравнению с

$ python -c "from importlib_metadata import version; print(version(\"lightgbm\"))"
2.2.3

Чтобы исправить ситуацию, необходимо удалить подпапку со старой версией (в данном случае 2.2.3) из пользовательской папки, так как pip обычно сохраняет только одну версию - последнюю установленную с флагом --user:

$ 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. Поэтому, когда вы установили пакет basemap через conda (вторым), ваши ранее установленные через pip numpy могли быть понижены до 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
0

Команда pip show selenium в Python 3.7 выводит информацию о пакете 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:
  • Name: Имя пакета — selenium.
  • Version: Версия установленного пакета — 4.0.0a3.
  • Summary: Краткое описание — "Python привязки для Selenium".
  • Home-page: Ссылка на домашнюю страницу проекта — Selenium на GitHub.
  • Author и Author-email: Автор и его email не указаны (UNKNOWN).
  • License: Лицензия — Apache 2.0.
  • Location: Путь, по которому установлен пакет — c:\python3.7\lib\site-packages\selenium-4.0.0a3-py3.7.egg.
  • Requires: Пакеты, от которых зависит Selenium — в данном случае это urllib3.
  • Required-by: Здесь можно увидеть пакеты, которые зависят от Selenium (пока нет).

Если у вас возникли проблемы с использованием этой команды или с самим пакетом, не стесняйтесь задавать дополнительные вопросы!

0

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

Для этого выполните следующую команду:

pip show <имя_пакета> | grep Version

Например:

pip show urllib3 | grep Version

Эта команда выведет только версии пакета. Вывод будет выглядеть примерно так:

Metadata-Version: 2.0
Version: 1.12

Таким образом, вы сможете быстро получить информацию о версии интересующего вас пакета.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь