5 проверенных способов узнать версию модуля Python в коде
Для кого эта статья:
- Разработчики Python, желающие улучшить управление зависимостями в своих проектах
- Студенты и специалисты, обучающиеся Python, ищущие практические советы по работе с библиотеками
Инженеры DevOps и другие профессионалы, занимающиеся настройкой и поддержкой Python-приложений
Управление зависимостями в Python — это искусство, которым должен владеть каждый разработчик. Зная точные версии установленных модулей, вы избежите пресловутого "у меня работает" синдрома и сэкономите часы на отладке. Неважно, разрабатываете ли вы корпоративное приложение или просто экспериментируете с кодом — точная информация о версиях модулей критична для стабильной работы ваших программ. Рассмотрим пять проверенных способов, которые помогут вам держать под контролем экосистему вашего Python-проекта. 🐍
Хотите уверенно управлять Python-проектами и никогда не сталкиваться с "dependency hell"? Программа Обучение Python-разработке от Skypro научит вас не только основам языка, но и профессиональным практикам работы с зависимостями. Наши студенты уже через 3 месяца создают рабочие проекты, где точно знают, какую версию модуля использовать и почему. Присоединяйтесь к сообществу разработчиков, которые контролируют каждый аспект своего кода!
Быстрая проверка версий модулей через атрибут
Самый прямолинейный способ узнать версию уже импортированного модуля — использовать атрибут __version__. Этот метод работает непосредственно в вашем коде или интерактивной среде Python, без необходимости запускать внешние команды.
Алексей, ведущий Python-разработчик Однажды я потратил целый день, отлаживая непонятную ошибку в проекте машинного обучения. Код, работавший безупречно на моем ноутбуке, выдавал странные результаты на сервере. Проблема оказалась банальной: версия scikit-learn на сервере была устаревшей. Простая проверка через
__version__могла бы сэкономить мне часы фрустрации. С тех пор я всегда добавляю в начало скриптов проверку версий критичных зависимостей:
import numpy as np
import pandas as pd
import sklearn
print(f"NumPy: {np.__version__}")
print(f"Pandas: {pd.__version__}")
print(f"Scikit-learn: {sklearn.__version__}")
# Дополнительная проверка минимальной требуемой версии
assert sklearn.__version__ >= '1.0.0', "Требуется scikit-learn 1.0.0 или выше!"
Эта простая практика позволила избежать десятков потенциальных проблем в производственной среде.
Важно понимать, что не все модули предоставляют атрибут __version__. Стандарт PEP 396 рекомендует, но не требует его наличия. Вот результаты проверки популярных библиотек:
| Библиотека | Атрибут version | Альтернативный атрибут |
|---|---|---|
| NumPy | Доступен | – |
| Pandas | Доступен | – |
| Django | Нет | django.VERSION |
| Flask | Доступен | – |
| TensorFlow | Доступен | – |
| Matplotlib | Доступен | matplotlib.version_info |
Для надежности можно использовать конструкцию с обработкой исключений:
try:
import module_name
version = module_name.__version__
print(f"Версия {module_name.__name__}: {version}")
except (ImportError, AttributeError):
print(f"Модуль не установлен или не имеет атрибута __version__")
Этот метод особенно полезен при отладке или когда вам нужно быстро проверить версию конкретного модуля прямо в коде. 🔍

Использование команды
Когда вам нужен общий обзор всех установленных Python-пакетов, команда pip list — ваш лучший помощник. Она выводит список всех установленных пакетов с их версиями в текущем окружении Python.
Базовое использование выглядит предельно просто:
pip list
Результат будет представлен в виде таблицы с двумя колонками: названием пакета и его версией:
Package Version
--------------- ---------
numpy 1.23.5
pandas 1.5.2
pip 22.3.1
requests 2.28.1
...
Для более удобного анализа или обработки вы можете вывести результат в различных форматах:
- Формат JSON:
pip list --format=json - Формат колонок:
pip list --format=columns(по умолчанию) - Простой текст:
pip list --format=freeze(аналогичен выводу pip freeze)
Полезные опции команды pip list:
| Опция | Описание | Пример использования |
|---|---|---|
| --outdated | Показывает только пакеты, для которых доступны обновления | pip list --outdated |
| --uptodate | Показывает только пакеты, для которых нет обновлений | pip list --uptodate |
| --not-required | Показывает пакеты, которые не требуются другими пакетами | pip list --not-required |
| --local | Показывает пакеты, установленные только в текущем окружении | pip list --local |
| --user | Показывает пакеты, установленные в директории пользователя | pip list --user |
Для быстрого поиска конкретного пакета можно комбинировать с grep (Linux/Mac) или findstr (Windows):
# Linux/Mac
pip list | grep numpy
# Windows
pip list | findstr numpy
Команда pip list --outdated особенно полезна для регулярного аудита зависимостей — она не только показывает текущие версии, но и доступные обновления:
Package Version Latest Type
---------- ------- ------- -----
numpy 1.21.0 1.23.5 wheel
pandas 1.3.0 1.5.2 wheel
Это простой и надежный способ держать под контролем состояние вашего Python-окружения, особенно когда вы работаете с множеством проектов и виртуальными окружениями. 📊
Получение подробной информации о модуле через
Когда вам нужна детальная информация об определенном пакете, команда pip show предоставляет исчерпывающие сведения, включая версию, автора, зависимости и многое другое. Этот инструмент незаменим для глубокого анализа конкретного модуля и понимания его взаимосвязей с другими компонентами вашего проекта.
Марина, DevOps-инженер При настройке CI/CD пайплайна для проекта на Django я столкнулась с загадочными ошибками совместимости. Деплой, работавший безупречно месяцами, внезапно начал падать. Быстрый анализ с помощью
pip showвыявил корень проблемы — зависимости одной из библиотек конфликтовали с недавно обновленным пакетом:
$ pip show django-rest-framework
Name: djangorestframework
Version: 3.14.0
Summary: Web APIs for Django, made easy.
Home-page: https://www.django-rest-framework.org/
Author: Tom Christie
Author-email: tom@tomchristie.com
License: BSD
Location: /usr/local/lib/python3.9/site-packages
Requires: django, pytz
Required-by: django-filter, drf-yasg
Именно секция "Required-by" дала понять, какие компоненты полагаются на этот модуль. Мы быстро зафиксировали версии всех взаимозависимых пакетов в requirements.txt, и проблема была решена за считанные минуты без глубокой отладки.
Для использования команды просто укажите имя пакета:
pip show package_name
Например:
pip show requests
Эта команда возвращает подробный отчет, включающий:
- Name: официальное название пакета
- Version: установленная версия
- Summary: краткое описание функциональности
- Home-page: URL проекта для получения дополнительной информации
- Author: разработчик или организация
- License: лицензия, под которой распространяется пакет
- Location: путь к установленному пакету в файловой системе
- Requires: прямые зависимости пакета
- Required-by: пакеты, которые зависят от данного модуля
Можно проверить несколько пакетов одновременно, перечислив их имена через пробел:
pip show numpy pandas matplotlib
Для удобства анализа вы можете сохранить информацию в файл:
pip show requests > requests_info.txt
Комбинирование с другими командами позволяет решать более сложные задачи. Например, чтобы проверить все установленные пакеты, содержащие определенное слово в названии:
pip list | grep django | cut -d " " -f1 | xargs pip show
Команда pip show особенно ценна при анализе конфликтов зависимостей, миграции проектов между разными окружениями или при необходимости точно понять, где физически расположен модуль в файловой системе. 🔬
Диагностика зависимостей с помощью
Команда pip freeze — это мощный инструмент для фиксации состояния вашего Python-окружения. В отличие от pip list, она выводит информацию в формате, готовом для создания файла requirements.txt, что делает её незаменимой для воспроизведения окружения на других машинах.
Базовое использование предельно просто:
pip freeze
Результат будет представлен в виде списка пакетов с точными версиями, зафиксированными через оператор ==:
numpy==1.23.5
pandas==1.5.2
requests==2.28.1
...
Главное преимущество pip freeze — создание воспроизводимого окружения. Чтобы сохранить текущее состояние зависимостей:
pip freeze > requirements.txt
Это создаст файл requirements.txt, который можно использовать для установки точно таких же версий пакетов в другом окружении:
pip install -r requirements.txt
Сравнение возможностей pip freeze и альтернативных инструментов:
| Функциональность | pip freeze | pip list | pip-compile (pip-tools) |
|---|---|---|---|
| Формат вывода для requirements.txt | ✅ | ❌ | ✅ |
| Включает все зависимости (включая вторичные) | ✅ | ✅ | ❌ (только явные) |
| Фильтрация системных пакетов | ❌ | ✅ (с опциями) | ✅ |
| Комментарии и метаданные | ❌ | ❌ | ✅ |
| Встроен в pip | ✅ | ✅ | ❌ |
Важно понимать, что pip freeze включает все установленные пакеты без разделения на прямые и транзитивные зависимости. В больших проектах это может привести к избыточным зависимостям. Для более точного контроля рекомендуется использовать специализированные инструменты, такие как pip-tools.
Полезные приемы использования pip freeze:
- Исключение определенных пакетов:
pip freeze | grep -v "package-to-exclude" > requirements.txt
- Сравнение окружений:
diff <(pip freeze) requirements.txt
- Создание минимальных requirements: Активируйте чистое виртуальное окружение, установите только непосредственно используемые пакеты, затем используйте freeze
Для проектов с разделением на среды разработки/тестирования/продакшн рекомендуется создавать отдельные файлы требований:
# Базовые зависимости
pip freeze > requirements.txt
# Зависимости для разработки
pip freeze > requirements-dev.txt
# Зависимости для тестирования
pip freeze > requirements-test.txt
Команда pip freeze — фундаментальный инструмент для обеспечения воспроизводимости Python-окружений и ключевой элемент профессиональной разработки. 📋
Программный способ проверки версий модулей в скриптах
Когда требуется автоматизированная проверка версий модулей непосредственно в коде, Python предлагает несколько программных методов. Эти подходы особенно ценны для создания самодиагностируемых скриптов, которые могут проверять совместимость зависимостей перед выполнением критических операций.
Основные способы программной проверки версий:
- Использование
__version__(традиционный метод) - Модуль
pkg_resources(стабильный, но устаревающий) - Модуль
importlib.metadata(современный, рекомендуемый с Python 3.8+) - Библиотека
packaging(для продвинутых сравнений версий)
Рассмотрим каждый метод более детально.
- Использование атрибута
__version__:
import tensorflow as tf
import pandas as pd
# Проверка версий
tf_version = getattr(tf, '__version__', 'Неизвестно')
pd_version = getattr(pd, '__version__', 'Неизвестно')
print(f"TensorFlow: {tf_version}")
print(f"Pandas: {pd_version}")
- Использование
pkg_resources(часть setuptools):
import pkg_resources
# Получение версии установленного пакета
numpy_version = pkg_resources.get_distribution('numpy').version
print(f"NumPy: {numpy_version}")
# Проверка соответствия требованиям
required_packages = {'numpy': '>=1.18.0', 'pandas': '>=1.0.0'}
for package, requirement in required_packages.items():
try:
pkg_resources.require(f"{package}{requirement}")
print(f"✅ {package} соответствует требованиям {requirement}")
except pkg_resources.VersionConflict as e:
print(f"❌ {package} не соответствует требованиям: {e}")
except pkg_resources.DistributionNotFound:
print(f"❌ {package} не установлен")
- Использование
importlib.metadata(Python 3.8+):
# Python 3.8+
from importlib.metadata import version, PackageNotFoundError
try:
numpy_version = version('numpy')
print(f"NumPy: {numpy_version}")
except PackageNotFoundError:
print("NumPy не установлен")
# Для Python < 3.8 можно использовать backport
# pip install importlib-metadata
# from importlib_metadata import version
- Продвинутая работа с версиями через библиотеку
packaging:
from packaging import version
import importlib.metadata
# Получение версии
pandas_version = importlib.metadata.version('pandas')
print(f"Pandas: {pandas_version}")
# Сравнение версий
if version.parse(pandas_version) >= version.parse('1.0.0'):
print("Версия Pandas поддерживает новый API")
else:
print("Требуется обновить Pandas до версии 1.0.0 или выше")
# Проверка диапазона версий
v = version.parse(pandas_version)
if version.parse('1.0.0') <= v < version.parse('2.0.0'):
print("Совместимая версия Pandas")
Для комплексной проверки зависимостей в начале скрипта можно использовать следующий шаблон:
try:
# Импорт модуля для проверки версий
from importlib.metadata import version, PackageNotFoundError
except ImportError:
# Для Python < 3.8
from importlib_metadata import version, PackageNotFoundError
def check_dependencies():
# Словарь с требованиями к версиям
requirements = {
'numpy': '>=1.18.0',
'pandas': '>=1.0.0,<2.0.0',
'scikit-learn': '>=1.0.0',
}
issues = []
from packaging import version, specifiers
for package, requirement in requirements.items():
try:
pkg_version = version.parse(version(package))
spec = specifiers.SpecifierSet(requirement)
if pkg_version not in spec:
issues.append(f"{package} версии {pkg_version} не соответствует требованию {requirement}")
except PackageNotFoundError:
issues.append(f"{package} не установлен")
if issues:
print("❌ Обнаружены проблемы с зависимостями:")
for issue in issues:
print(f" – {issue}")
return False
print("✅ Все зависимости соответствуют требованиям")
return True
# Проверка зависимостей перед запуском основного кода
if check_dependencies():
# Основной код программы
pass
else:
print("Пожалуйста, установите необходимые зависимости перед запуском")
# Выход или продолжение с ограниченной функциональностью
Программные методы проверки версий особенно полезны в нескольких сценариях:
- Автоматизированные тесты, требующие конкретных версий библиотек
- Скрипты, которые должны адаптировать свое поведение в зависимости от доступных API
- Приложения с критическими требованиями к стабильности и совместимости
- Инструменты диагностики и мониторинга Python-окружений
Используя программные методы проверки версий, вы создаете более надежные и самодиагностируемые приложения, способные предотвращать проблемы совместимости еще до их возникновения. 🛠️
Контроль версий модулей Python — это не просто техническая деталь, а ключевой аспект профессиональной разработки. Рассмотренные пять методов дают вам полный арсенал инструментов: от быстрых проверок через
__version__до комплексного анализа сpip showи программной диагностики черезimportlib.metadata. Применяя эти техники, вы сможете избежать большинства проблем с зависимостями, а ваши проекты станут более надежными и предсказуемыми. Помните: знание точных версий модулей — это не просто удобство, а необходимое условие воспроизводимости вашего кода в любой среде выполнения.