Проверка версии requests: практические примеры
Обзор задачи проверки версии requests
При разработке на Python важно контролировать версии установленных библиотек. Библиотека requests не исключение: от её версии зависит доступность некоторых функций и обратная совместимость. Ниже рассмотрены основные подходы для получения номера версии requests в рабочем окружении.
Наиболее эффективный способ - обратиться к атрибуту __version__ самого модуля. Этот атрибут присутствует в пакетах, которые следуют стандартам упаковки Python.
import requests
print(requests.__version__)Installing python modules (установка модулей python)
2.31.0
Python requirements (файл requirements.txt в python)
Данный метод работает во всех версиях requests, начиная с самых ранних. Однако если пакет не установлен, возникнет исключение ModuleNotFoundError.
Типичная ошибка: попытка импортировать requests, когда окружение не настроено (отсутствует virtualenv или пакет не установлен). Решение - предварительно установить библиотеку через pip install requests или использовать более мягкий импорт с обработкой ошибки.
Как узнать версию через pip show без импорта?
Если импорт модуля нежелателен (например, в сценариях автоматизации), можно вызвать утилиту pip из командной строки или через подпроцесс.
import subprocess
result = subprocess.run(['pip', 'show', 'requests'], capture_output=True, text=True)
print(result.stdout)
Python requirements file (файл requirements.txt в python)
Name: requests Version: 2.31.0 ...
Python get requirements (получение списка зависимостей requirements.txt в python)
Другой вариант - использовать pip list и отфильтровать строку.
Проблема: pip может не находиться в PATH или быть недоступным внутри виртуального окружения. Для гарантии лучше указывать полный путь к pip (например, sys.executable + ' -m pip show requests').
Как получить версию через pkg_resources (setuptools)?
Классический способ, доступный в старых версиях pip и setuptools. Функция pkg_resources.get_distribution возвращает объект Distribution, у которого есть атрибут version.
import pkg_resources
try:
version = pkg_resources.get_distribution('requests').version
print(version)
except pkg_resources.DistributionNotFound:
print('requests не установлен')сделать requirements python (создание requirements.txt для python)
В новых версиях setuptools пакет pkg_resources помечен как устаревший, а в Python 3.12+ его может не быть. Рекомендуется использовать importlib.metadata (см. ниже).
Как применить importlib.metadata (современный стандарт)?
Начиная с Python 3.8 в стандартной библиотеке появился модуль importlib.metadata, который позволяет получать метаданные установленных пакетов.
from importlib.metadata import version, PackageNotFoundError
try:
ver = version('requests')
print(ver)
except PackageNotFoundError:
print('requests не найден')Python uv install (установка пакетов с помощью uv в python)
2.31.0
Requests python versions (проверка версии библиотеки requests в python)
Этот метод предпочтителен для новых проектов, так как не требует дополнительных зависимостей и поддерживается в Python 3.8+.
Ошибка: если пакет установлен в режиме editable (pip install -e), importlib.metadata может вернуть версию 0.0.0 или неверную. В таких случаях стоит проверять через pip show или атрибут __version__.
Как сравнить версию с требуемой в коде?
Иногда нужно проверить, что версия requests не ниже определённой. Для этого удобно воспользоваться packaging.version или простым парсингом строки.
from importlib.metadata import version
from packaging.version import Version
installed = Version(version('requests'))
required = Version('2.25.0')
if installed >= required:
print('Версия подходит')
else:
print('Требуется обновление')Библиотека packaging может отсутствовать, её нужно установить отдельно (pip install packaging).
Расширенные примеры проверки версии requests
Проверка версии в виртуальном окружении
Часто проекты используют разные виртуальные окружения. Убедиться, что requests установлен именно в активном окружении, можно через запуск интерпретатора Python с явным указанием пути к исполняемому файлу окружения.
import sys
import subprocess
venv_python = '/path/to/venv/bin/python'
result = subprocess.run([venv_python, '-c', 'import requests; print(requests.__version__)'],
capture_output=True, text=True)
print(result.stdout.strip())Если requests не установлен, в stderr будет сообщение об ошибке импорта.
Автоматическое обновление requests до актуальной версии
Сценарий: перед запуском приложения проверяется версия, и если она ниже требуемой, выполняется обновление через pip.
import subprocess
import sys
from importlib.metadata import version, PackageNotFoundError
required = '2.25.0'
try:
installed = version('requests')
if installed < required:
print(f'Обновление requests с {installed} до {required}...')
subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'requests'])
except PackageNotFoundError:
print('Установка requests...')
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'requests'])Такой подход удобен в Docker-контейнерах или CI/CD пайплайнах.
Проверка версии без доступа к командной строке (например, в Jupyter Notebook)
В интерактивной среде можно просто выполнить import requests; requests.__version__.
import requests
version = requests.__version__
print(f'Установлена версия {version}')
# Проверка минимальной версии для поддержки файловых кусков
if int(version.split('.')[0]) >= 2 and int(version.split('.')[1]) >= 20:
print('Поддержка multipart-загрузки доступна')Использование pip list в JSON-формате
Можно получить данные в машиночитаемом виде и затем распарсить.
import json
import subprocess
result = subprocess.run([sys.executable, '-m', 'pip', 'list', '--format=json'],
capture_output=True, text=True)
packages = json.loads(result.stdout)
for pkg in packages:
if pkg['name'].lower() == 'requests':
print(pkg['version'])
breakЭтот способ полезен, если нужно проверить сразу несколько библиотек.
Проверка версии внутри исключения при импорте
Иногда код должен работать с разными версиями requests, и некоторые атрибуты отсутствуют. Лучше импортировать базовый модуль и проверять версию.
try:
import requests
ver = requests.__version__
major, minor, *_ = map(int, ver.split('.'))
if major == 2 and minor < 25:
# Обходной код для старых версий
print('Работаем в режиме совместимости')
except ModuleNotFoundError:
print('requests не установлен, функциональность недоступна')Проверка версии во время выполнения тестов (pytest)
В тестовых сценариях можно пропускать тесты, если версия requests не подходит.
import pytest
from importlib.metadata import version
requests_version = version('requests')
pytestmark = pytest.mark.skipif(
requests_version < '2.25',
reason='Требуется requests >= 2.25'
)
def test_something():
# тест, который зависит от новой функциональности
passТак тестирование становится гибким.