Определение номера версии Python
Основные методы проверки версии Python
Как эффективно получить версию Python из командной строки и внутри кода?
Самый распространённый способ проверить версию Python в системе это использование команды python --version или python3 --version. В сценариях, где требуется программно определить версию, применяют встроенный модуль sys и его атрибуты sys.version и sys.version_info.
# Команда для терминала (Linux/macOS)
python3 --versionCheck python version (проверка версии python)
Python 3.12.3
# Проверка внутри скрипта
import sys
print(sys.version)3.12.3 (main, Apr 10 2024, 14:20:34) [GCC 13.2.0]
Атрибут sys.version_info возвращает именованный кортеж с числовыми компонентами, что удобно для сравнения.
import sys
if sys.version_info < (3, 6):
print("Требуется Python 3.6 или новее")
sys.exit(1)Типичная ошибка: если в системе установлено несколько версий Python, команда python может указывать на Python 2. Для явного вызова используют python3 или полный путь. В Windows команда py запускает менеджер версий, а py -3.12 позволяет выбрать конкретную версию.
Как проверить версию Python в системе с несколькими установками?
Если одновременно установлены Python 2 и Python 3, следует использовать python3 --version для третьей версии и python2 --version для второй. Альтернатива which python3 покажет путь к интерпретатору, а ls /usr/bin/python* перечислит все доступные версии.
which python3
ls /usr/bin/python*/usr/bin/python3 /usr/bin/python3.10 /usr/bin/python3.11 /usr/bin/python3.12
На некоторых дистрибутивах python может отсутствовать вовсе, если не установлен пакет python-is-python3.
Как получить версию Python в удобном для сравнения формате?
Для сравнения версий лучше использовать sys.version_info, который возвращает кортеж (major, minor, micro). Это позволяет выполнять числовые сравнения без парсинга строк.
import sys
ver = sys.version_info
print(f"Major: {ver.major}, Minor: {ver.minor}, Micro: {ver.micro}")
if ver.major == 3 and ver.minor >= 10:
print("Версия подходит для новых возможностей")Если в коде используется sys.version, то извлечение числовых значений требует регулярных выражений, что менее надёжно.
Как проверить версию Python из другого скрипта (например, Bash)?
Для вызова Python из другого языка удобен модуль subprocess. В Bash можно просто выполнить команду и прочитать вывод.
# Bash
python_version=$(python3 --version 2>&1)
echo "Версия: $python_version"Версия: Python 3.12.3
# Из Python скрипта с subprocess
import subprocess
result = subprocess.run(['python3', '--version'], capture_output=True, text=True)
print(result.stdout.strip())Python 3.12.3
Команда python3 --version выводит сообщение в stderr в некоторых старых версиях, поэтому 2>&1 в Bash или stderr=subprocess.STDOUT в Python обязательны.
Как получить версию Python с использованием модуля platform?
Модуль platform предоставляет функцию python_version(), возвращающую строку, и python_version_tuple() для кортежа.
import platform
print(platform.python_version())
print(platform.python_version_tuple())3.12.3
('3', '12', '3')В модуле platform есть также python_implementation() для определения CPython, PyPy и т.д., но для простой проверки версии sys более лёгкий вариант.
Как проверить версию Python внутри виртуального окружения?
Активированное виртуальное окружение использует собственный интерпретатор. Любые команды python --version или sys.version покажут версию, соответствующую базовому Python, из которого создано окружение. Проверить можно так же, как и для системного.
# В активированном окружении
python --versionPython 3.11.5
Если окружение создано с явным указанием версии (например, virtualenv -p python3.10), то команда покажет именно эту версию. Ошибка возникает, если указанный путь к интерпретатору не существует.
Расширенные примеры проверки версии Python
Ниже приведены более сложные сценарии, которые помогут в автоматизации и диагностике.
Проверка минимальной версии и завершение скрипта
import sys
import platform
required = (3, 8)
current = sys.version_info[:2]
if current < required:
print(f"Ошибка: требуется Python {'.'.join(map(str, required))}, "
f"текущая версия {'.'.join(map(str, current))}")
sys.exit(1)
else:
print(f"Версия {platform.python_version()} подходит")Версия 3.12.3 подходит
Сравнение версий с использованием packaging.version
from packaging.version import Version
import sys
sys_ver = Version(sys.version.split()[0])
required = Version('3.9.0')
if sys_ver >= required:
print(f"Версия {sys_ver} удовлетворяет требованию")
else:
print(f"Требуется обновление до {required}")Версия 3.12.3 удовлетворяет требованию
Получение версии из subprocess с обработкой ошибок
import subprocess
import sys
def get_python_version(executable='python3'):
try:
result = subprocess.run([executable, '--version'],
capture_output=True, text=True, timeout=5)
if result.returncode != 0:
raise RuntimeError(f"Команда завершилась с ошибкой: {result.stderr}")
# Убираем префикс "Python " и пробелы
version_str = result.stdout.strip() or result.stderr.strip()
return version_str.split()[1] if version_str.startswith('Python') else version_str
except FileNotFoundError:
print(f"Исполняемый файл {executable} не найден")
except subprocess.TimeoutExpired:
print("Тайм-аут при выполнении команды")
return None
print(get_python_version('python3'))3.12.3
Кроссплатформенное определение версии (Windows, Linux, macOS)
import sys
import platform
system = platform.system()
if system == 'Windows':
# На Windows часто используется py launcher
import subprocess
result = subprocess.run(['py', '--list-paths'], capture_output=True, text=True)
print("Доступные версии Python:")
print(result.stdout)
elif system in ('Linux', 'Darwin'):
import subprocess
execs = ['python3', 'python', 'python2']
for exe in execs:
result = subprocess.run([exe, '--version'], capture_output=True, text=True, timeout=2)
if result.returncode == 0:
print(f"{exe}: {result.stdout.strip()}")
else:
print(f"Неизвестная ОС: {system}")python3: Python 3.12.3 python: не найден python2: не найден
Проверка версии Python в конвейере CI/CD (GitHub Actions)
# В файле .github/workflows/ci.yml
# шаг для проверки версии:
# - name: Check Python version
# run: python3 --version
# или в скрипте:
import os
python_version = os.popen('python3 --version').read().strip()
print(f"Версия в CI: {python_version}")Использование platform.python_version_tuple() для разбора компонентов
import platform
ver_tuple = platform.python_version_tuple()
major, minor, micro = ver_tuple
print(f"Major: {major}, Minor: {minor}, Micro: {micro}")
# Сравнение с целыми числами
if int(major) == 3 and int(minor) >= 10:
print("Поддерживает match-case")Major: 3, Minor: 12, Micro: 3 Поддерживает match-case