Узнать, какая версия пакета установлена с помощью pip
Как узнать установленную версию пакета с помощью pip?
Я использую pip для управления пакетами Python и хотел бы узнать, как можно определить, какая версия конкретного пакета в настоящее время установлена на моем компьютере.
Я знаю о команде pip install XYZ --upgrade
, но интересно, существует ли что-то вроде pip info XYZ
для получения информации о текущей версии пакета. Если такой команды нет, как лучше всего узнать, какую версию я сейчас использую?
5 ответ(ов)
Вы можете дать свой отзыв на запрос на извлечение (pull request) в pip с улучшением по примеру, который привел Хуго Таварес. В данном случае вы можете использовать следующую команду, чтобы отобразить информацию о пакете specloud
:
$ pip show specloud
Команда выведет следующую информацию:
Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
Это позволит вам увидеть, какая версия пакета установлена, и какие дополнительные зависимости требуются для его работы. Если у вас есть другие вопросы или нужны уточнения, не стесняйтесь задавать их!
Если вы используете --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.
Для получения версии пакета в формате, удобном для машинного чтения, в 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
Команда 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 (пока нет).
Если у вас возникли проблемы с использованием этой команды или с самим пакетом, не стесняйтесь задавать дополнительные вопросы!
Вы можете использовать команду grep
, чтобы узнать информацию о версии пакета.
Для этого выполните следующую команду:
pip show <имя_пакета> | grep Version
Например:
pip show urllib3 | grep Version
Эта команда выведет только версии пакета. Вывод будет выглядеть примерно так:
Metadata-Version: 2.0
Version: 1.12
Таким образом, вы сможете быстро получить информацию о версии интересующего вас пакета.
Как удалить все пакеты, установленные через pip?
Установка пакета из ветки Git-репозитория с помощью pip
Как обновить pip изнутри виртуального окружения?
Ошибка EnvironmentError: не найден mysql_config при установке mysql-python с помощью pip
Как заставить pip переустановить текущую версию?