Знакома ли вам ситуация, когда вы начинаете новый проект, а он требует Python 3.8, в то время как на вашей системе установлен Python 3.10? Или когда вы пытаетесь запустить старый скрипт, а он выдаёт кучу ошибок несовместимости, потому что был написан для Python 2.7? Если да, то вы не одиноки (ну, по крайней мере я с вами). Большинство Python-разработчиков рано или поздно сталкиваются с этой проблемой.
Python очень динамичен. С одной стороны, это здорово — язык постоянно эволюционирует, обрастает новыми возможностями, становится быстрее и удобнее. С другой — это порождает настоящую головную боль при работе над разными проектами. Выпуск новых версий Python иногда вносит изменения, нарушающие обратную совместимость. Свежий пример: переход с Python 2 на Python 3 был настолько серьёзным, что многие проекты годами адаптировались к новой версии.
Даже внутри ветки Python 3 есть достаточно различий между минорными версиями. Функциональность, добавленная в 3.9 или 3.10, не будет работать в проектах на Python 3.8. Новые синтаксические конструкции, вроде assignment expressions (:=) из Python 3.8, вызовут синтаксическую ошибку в Python 3.7. А как быть, если вы работаете над несколькими проектами одновременно, и каждый требует своей версии Python? Стандартные решения вроде использования системного Python обычно не подходят для профессиональной разработки. Обновление системного Python может нарушить работу системных утилит. Установка нескольких версий Python вручную и переключение между ними — тоже не лучший вариант, особенно если их много. Именно для решения этих проблем был создан pyenv — инструмент, который позволяет легко управлять несколькими версиями Python на одной системе.
Pyenv — это менеджер версий Python, который позволяет:- Устанавливать несколько версий Python параллельно
- Легко переключаться между ними глобально или для конкретного проекта
- Указывать точную версию Python для каждого проекта
- Создавать изолированные виртуальные окружения с нужной версией Python
В отличие от виртуальных окружений (venv или virtualenv), которые решают проблему изоляции зависимостей, pyenv фокусируется именно на управлении разными версиями самого интерпретатора Python. По факту, pyenv — это слой абстракции, который позволяет забыть о том, как именно установлены разные версии Python в вашей системе, и сосредоточиться на написании кода. Что особенно радует в pyenv — он не требует прав админа и работает на уровне пользователя, не влияя на системный Python. Это делает его безопасным для использования даже на продакшн-серверах.
Pyenv использует простой, но элегантный механизм переопределения пути к исполняемым файлам Python, что делает его легким и надежным решением. Он не эмулирует различные версии Python и не создаёт символические ссылки — вместо этого он устанавливает настоящие, полноценные версии интерпретатора в изолированные директории. Если вам надоело жонглировать разными версиями Python вручную или вы устали от фразы "работает на моей машине", pyenv может стать вашим спасением.
Установка pyenv
Перед погружением в Нарнию управление версиями Python нам нужно установить pyenv. Установка немного различается в зависимости от операционной системы, но общая концепция везде одинакова. Прежде чем начать, стоит отметить, что pyenv изначально был разработан для Unix-подобных систем — macOS и Linux, хотя существуют и варианты для Windows.
Установка на macOS
На macOS самый удобный способ установки — использовать менеджер пакетов Homebrew:
| Bash | 1
2
| brew update
brew install pyenv |
|
Эта пара строк избавят вас от множества хлопот. Homebrew автоматически разрешит зависимости и настроит базовые пути. Однако, как говорит старая программистская мудрость, "нет ничего быстрее, чем одна команда... кроме нуля команд" — поэтому важно убедиться, что Homebrew у вас уже установлен.
Установка на Linux
Для Linux процесс немного отличается. Хотя pyenv не всегда доступен в официальных репозиториях, установка по-прежнему довольно проста. Можно использовать скрипт автоматической установки:
| Bash | 1
| curl https://pyenv.run | bash |
|
Или вы можете выполнить клонирование репозитория pyenv вручную:
| Bash | 1
| git clone https://github.com/pyenv/pyenv.git ~/.pyenv |
|
На Ubuntu и Debian перед установкой pyenv рекомендуется установить несколько пакетов-зависимостей:
| Bash | 1
2
3
4
| sudo apt-get update
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl |
|
Без этих зависимостей pyenv может работать нестабильно или даже не запуститься вовсе. Особенно важны инструменты компиляции, так как pyenv компилирует нужные версии Python из исходников.
Установка на Windows
Исторически pyenv был доступен только для Unix-систем, но сообщество не оставило пользователей винды без решения. Для них (точнее, нас) существует форк под названием pyenv-win:
| Bash | 1
| pip install pyenv-win --target $HOME\.pyenv |
|
Или с помощью PowerShell:
| PowerShell | 1
| Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1" |
|
Стоит отметить, что функциональность Windows-версии может немного отличаться, а некоторые продвинутые возможности могут быть недоступны.
Критически важные зависимости
Независимо от операционной системы, pyenv требует определенных зависимостей для корректной работы. Самое важное — это наличие компилятора и заголовочных файлов для сборки Python. Когда pyenv устанавливает новую версию Python, он фактически скачивает исходный код этой версии и компилирует его. Это позволяет получить чистую, "ванильную" версию Python, не модифицированную под конкретную ОС. Это один из больших плюсов pyenv — вы получаете именно тот Python, который ожидаете, без неожиданных патчей или модификаций.
Отсутствие необходимых зависимостей обычно проявляется во время установки новых версий Python. Типичная ошибка выглядит примерно так: ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib? — и это верный признак того, что не хватает какой-то библиотеки.
Настройка оболочки
После установки pyenv необходимо настроить переменные среды и PATH для вашей оболочки. Это важный шаг, без которого pyenv просто не будет работать правильно. Для bash добавьте следующие строки в ~/.bashrc или ~/.bash_profile:
| Bash | 1
2
3
4
| export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)" |
|
Для zsh (например, если вы используете macOS Catalina и новее) добавьте те же строки в ~/.zshrc:
| Bash | 1
2
3
4
| export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)" |
|
Для fish shell создайте файл ~/.config/fish/conf.d/pyenv.fish:
| Bash | 1
2
3
4
| set -Ux PYENV_ROOT $HOME/.pyenv
set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths
status is-login; and pyenv init --path | source
pyenv init - | source |
|
После изменения файлов конфигурации стоит перезапустить терминал или применить изменения с помощью source:
| Bash | 1
2
| source ~/.bashrc # для bash
source ~/.zshrc # для zsh |
|
Проверка установки
Чтобы убедиться, что pyenv установлен корректно, выполните:
Если вы видите номер версии (например, pyenv 2.3.1), поздравляю — установка прошла успешно! Теперь вы готовы управлять множеством версий Python с легкостью старого волшебника, для которого магия давно стала обыденностью.
С установленным pyenv вы получаете средство для разрешения "версионных войн" в Python-экосистеме. Но установка — это только первый шаг. Дальше мы разберемся как использовать pyenv для управления Python-окружениями.
Управление несколькими версиями Python Доброго дня.
Есть сервер Debian 5.10.46-5
На него поставил python3.11.
При создание виртуального окружения появляются проблемы
... Различия между версиями в python изучаю питон, хочу решить легенькую задачку по спискам, найти сумму элементов нечетных(четных) чисел в списке. знаю , как ответ будет во второй... Pipenv vs Poetry vs Pyenv Чем по функционалу эти среды отличаются друг от друга? Как отправлять данные на сервер с помощью Python и принимать их там с помощью php? Здравствуйте, мне необходимо отправлять данные на сервер с помощью Python и принимать их там с помощью php. Подскажите, пожалуйста, как это можно...
Базовые команды pyenv
Теперь, когда pyenv установлен и настроен, пора познакомиться с его набором команд. Pyenv предлагает понятный интерфейс, который позволяет легко управлять множеством версий Python. Если вы когда-либо работали с git, вам будет знаком этот подход — простые команды, выполняющие конкретные действия без лишней мишуры.
Просмотр доступных версий Python
Прежде чем устанавливать новую версию Python, полезно узнать, какие версии доступны. Команда pyenv install --list выводит все версии, которые можно установить:
Результат будет впечатляющим — вы увидите длинный список версий, включая не только стандартные релизы CPython, но и различные реализации вроде Anaconda, PyPy и Stackless Python. Это настоящий клад для экспериментатора! Если этот список кажется слишком длинным, воспользуйтесь grep для фильтрации:
| Bash | 1
| pyenv install --list | grep "3.10" |
|
Эта команда покажет только версии Python 3.10.x, что намного удобнее для поиска конкретной минорной версии.
Установка версий Python
Когда вы определились с версией, установка выполняется одной командой:
Pyenv скачает исходный код Python 3.10.4, скомпилирует его и установит в изолированную директорию внутри ~/.pyenv/versions/. Первая компиляция может занять некоторое время — pyenv собирает полноценный интерпретатор со всеми оптимизациями, что гарантирует производительность на уровне официальных сборок. Если вы получаете ошибки при компиляции, скорее всего не хватает какой-то зависимости. Обычно pyenv выдаёт довольно информативные сообщения об ошибках, которые помогают диагностировать проблему.
Иногда полезно установить конкретную сборку с определёнными патчами или опциями компиляции. Для этого можно использовать переменные окружения:
| Bash | 1
| PYTHON_CONFIGURE_OPTS="--enable-optimizations --with-lto" pyenv install 3.9.12 |
|
Эта команда установит Python 3.9.12 с включенными оптимизациями и межмодульной оптимизацией времени компоновки (LTO), что может значительно ускорить выполнение кода.
Переключение между версиями Python
После установки нескольких версий Python встаёт вопрос переключения между ними. Pyenv предлагает три уровня "областей видимости" для версий Python:
1. Глобальная версия — используется по умолчанию в системе
2. Локальная версия — применяется в конкретном каталоге и его подкаталогах
3. Версия для оболочки — временная версия для текущей сессии терминала
Для установки глобальной версии используйте:
Теперь Python 3.10.4 будет использоваться по умолчанию в любой директории, где не задана локальная версия. Для проекта часто требуется зафиксировать определённую версию Python. В этом случае перейдите в директорию проекта и выполните:
Эта команда создаст файл .python-version в текущей директории, указывающий pyenv использовать Python 3.8.13 для этого проекта. Преимущество такого подхода в том, что настройка привязана к директории и работает автоматически — стоит зайти в директорию проекта, и pyenv активирует нужную версию Python. Если вам нужно временно переключиться на другую версию Python, не меняя глобальные или локальные настройки, используйте:
Эта версия будет активна только в текущей сессии терминала. Закрыв терминал и открыв новый, вы вернётесь к ранее настроенной (глобальной или локальной) версии. Чтобы проверить, какая версия Python активна в данный момент, используйте:
А для просмотра всех установленных версий:
Зведочкой будет отмечена текущая активная версия. Например:
| Bash | 1
2
3
4
| * 3.10.4 (set by /Users/username/.python-version)
3.8.13
3.9.12
system |
|
Удаление версий Python
Если какая-то версия Python больше не нужна, её можно легко удалить:
Эта команда полностью удалит указанную версию из ~/.pyenv/versions/, освобождая место на диске. Учтите, что если удаляемая версия используется в каких-то проектах (через локальные .python-version файлы), при переходе в эти директории pyenv будет выдавать предупреждения.
Работа с несколькими версиями одновременно
Иногда нужно указать несколько версий Python для проекта — например, если вы хотите убедиться, что ваш код работает в Python 3.8, 3.9 и 3.10. Pyenv поможет и в этом:
| Bash | 1
| pyenv local 3.10.4 3.9.12 3.8.13 |
|
В этом случае pyenv создаст приоритезированный список версий. Когда вы выполняете python, будет использована первая версия из списка (3.10.4). Но вы также можете явно обратиться к любой версии из списка:
| Bash | 1
2
3
| python3.8 # Запустит Python 3.8.13
python3.9 # Запустит Python 3.9.12
python3.10 # Запустит Python 3.10.4 |
|
Такой подход особенно полезен при разработке библиотек, которые должны поддерживать несколько версий Python.
Создание виртуальных окружений с pyenv
Одна из приятных особенностей pyenv — возможность создавать виртуальные окружения для каждой установленной версии Python. Для этого используется плагин pyenv-virtualenv, который добавляет соответствующую функциональность к базовому pyenv. На macOS установка плагина выполняется через Homebrew:
| Bash | 1
| brew install pyenv-virtualenv |
|
На Linux и других Unix-системах установка выполняется через git:
| Bash | 1
| git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv |
|
После установки добавьте в ваш ~/.bashrc или ~/.zshrc:
| Bash | 1
| eval "$(pyenv virtualenv-init -)" |
|
Создать виртуальное окружение с конкретной версией Python очень просто:
| Bash | 1
| pyenv virtualenv 3.10.4 my-project-env |
|
Эта команда создаст виртуальное окружение на базе Python 3.10.4 с именем "my-project-env". Активировать его можно двумя способами:
| Bash | 1
2
3
4
5
6
| # Способ 1 - явная активация
pyenv activate my-project-env
# Способ 2 - автоматическая активация через .python-version
cd /path/to/project
pyenv local my-project-env |
|
Второй способ особенно удобен, так как при входе в директорию проекта окружение активируется автоматически, а при выходе — деактивируется. Никаких ручных действий не требуется!
Для деактивации окружения используйте:
А чтобы удалить виртуальное окружение, когда оно больше не нужно:
| Bash | 1
| pyenv uninstall my-project-env |
|
Работа с Python-пакетами в разных версиях
Pyenv прекрасно работает со стандартными инструментами управления пакетами Python — pip, pipenv и poetry. Каждая установленная версия Python имеет свой отдельный pip и набор пакетов. Например, установка пакета для конкретной версии:
| Bash | 1
2
3
4
5
6
7
8
| # Активируем нужную версию Python
pyenv shell 3.9.12
# Устанавливаем пакеты через pip
pip install requests numpy pandas
# Проверяем установленные пакеты
pip list |
|
Если вы используете виртуальные окружения pyenv-virtualenv, то пакеты устанавливаются изолированно в рамках конкретного окружения:
| Bash | 1
2
3
4
5
6
7
8
| # Активируем виртуальное окружение
pyenv activate my-project-env
# Устанавливаем пакеты
pip install django==4.0.4
# Создаём requirements.txt для проекта
pip freeze > requirements.txt |
|
Такой подход гарантирует, что зависимости одного проекта не будут конфликтовать с зависимостями другого, даже если оба используют одну и ту же версию Python. Для тех, кто предпочитает современные инструменты управления зависимостями, pyenv отлично интегрируется с pipenv и poetry:
| Bash | 1
2
3
4
5
6
7
8
9
| # Указываем локальную версию Python для проекта
cd /path/to/project
pyenv local 3.10.4
# Инициализируем Poetry в проекте
poetry init
# Теперь Poetry будет использовать Python 3.10.4
poetry add flask |
|
Такая гибкость позволяет выбирать инструменты, наиболее подходящие для каждого конкретного проекта, не беспокоясь о совместимости версий Python.
Продвинутые техники
Освоив базовые команды pyenv, уже можно решать большинство типичных задач управления версиями Python. Но что если нужно еще больше гибкости, автоматизации и интеграции с рабочим процессом? Тогда рассмотрим некоторые продвинутые техники.
Глубже в локальные и глобальные версии
Я уже упоминал о локальных и глобальных версиях, но отмечу, что pyenv использует прозрачную систему приоритетов при выборе версии Python:
1. Версия, установленная через pyenv shell (самый высокий приоритет).
2. Локальная версия из файла .python-version в текущей директории.
3. Локальная версия из файла .python-version в родительской директории (и так вверх по дереву каталогов).
4. Глобальная версия из $(pyenv root)/version.
5. Системная версия Python (если pyenv не может найти другую версию).
Эта иерархия даёт большую гибкость при организации проектов. Например, вы можете установить для всей команды разработки базовую версию Python через локальный файл .python-version в корне проекта, но при этом временно использовать другую версию через pyenv shell для экспериментов или отладки. Интересная стратегия — использование многоуровневых локальных настроек. Представьте монорепозиторий с несколькими проектами, где разные части требуют разных версий Python:
[/BASH]
/monorepo (Python 3.9.12 через .python-version)
/project-legacy (Python 3.7.13 через .python-version)
/project-modern (Python 3.10.4 через .python-version)
/experiments (без файла .python-version, наследует 3.9.12)
[/BASH]
При такой структуре pyenv автоматически выберет правильную версию Python при навигации между директориями, что очень удобно в больших проектах.
Интеграция с проектами и рабочими процессами
Pyenv легко интегрируется с популярными инструментами разработки благодаря своей простой, но элегантной архитектуре.
Интеграция с poetry
Для пользователей poetry можно настроить автоматическое создание виртуальных окружений с правильной версией Python:
| Bash | 1
2
3
| # В директории проекта
pyenv local 3.10.4
poetry env use python |
|
Эта последовательность команд указывает poetry использовать Python 3.10.4, установленный через pyenv. Преимущество такого подхода в том, что poetry будет создавать виртуальные окружения на базе конкретной версии Python, а не той, которая доступна в системе по умолчанию.
Интеграция с tox
Тестирование в нескольких средах с помощью tox становится особенно мощным в комбинации с pyenv. Модифицируйте tox.ini:
| Bash | 1
2
3
4
5
6
7
| [tox]
envlist = py38,py39,py310
isolated_build = True
[testenv]
deps = pytest
commands = pytest {posargs:tests} |
|
Установите все нужные версии Python через pyenv:
| Bash | 1
2
3
4
| pyenv install 3.8.13
pyenv install 3.9.12
pyenv install 3.10.4
pyenv local 3.10.4 3.9.12 3.8.13 |
|
Теперь tox может автоматически использовать все указанные версии Python для запуска тестов, не требуя ручного переключения.
Интеграция с Makefile
Для проектов, использующих Make, можно автоматизировать настройку окружения:
| Bash | 1
2
3
4
5
6
7
| .PHONY: setup
setup:
pyenv install -s 3.10.4
pyenv local 3.10.4
python -m pip install --upgrade pip
pip install -r requirements.txt |
|
Флаг -s (skip) в pyenv install пропускает установку, если версия уже установлена, что делает Makefile идемпотентным — его можно запускать многократно без побочных эффектов.
Использование pyenv в CI/CD
Интеграция pyenv в конвейеры непрерывной интеграции и развертывания добавляет стабильности автоматизированным процессам. Особенно это полезно, когда CI-средa может использовать разные версии Python.
GitHub Actions
Вот пример использования pyenv в GitHub Actions:
| YAML | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| name: Test with multiple Python versions
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install pyenv
run: |
curl [url]https://pyenv.run[/url] | bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> $GITHUB_ENV
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> $GITHUB_ENV
echo 'eval "$(pyenv init --path)"' >> $GITHUB_ENV
- name: Install Python versions
run: |
pyenv install 3.8.13
pyenv install 3.9.12
pyenv global 3.9.12
- name: Run tests
run: |
python -m pip install tox
tox |
|
Такой подход гарантирует, что тесты будут запускаться в точно тех же версиях Python, которые вы используете локально, независимо от того, какие версии предустановлены в CI-среде.
GitLab CI
В GitLab CI pyenv также может быть полезен:
| YAML | 1
2
3
4
5
6
7
8
9
10
11
12
13
| test:
image: python:3.9-slim
script:
- apt-get update && apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl git
- curl [url]https://pyenv.run[/url] | bash
- export PYENV_ROOT="$HOME/.pyenv"
- export PATH="$PYENV_ROOT/bin:$PATH"
- eval "$(pyenv init --path)"
- pyenv install 3.8.13
- pyenv install 3.10.4
- pyenv global 3.8.13 3.10.4
- python -m pip install tox
- tox |
|
Автоматизация переключения версий
Pyenv предлагает несколько способов автоматизировать переключение между версиями Python.
Хуки каталогов
Помимо автоматической активации версий через .python-version, pyenv поддерживает хуки, которые позволяют выполнять дополнительные действия при входе в директорию или выходе из неё. Это особенно полезно в сочетании с pyenv-virtualenv. Например, можно автоматически устанавливать переменные окружения при активации определенной версии Python:
| Bash | 1
2
| # Создайте хук активации для вашего виртуального окружения
echo 'export DEBUG=True' > $(pyenv root)/versions/myenv/bin/activate.d/env.sh |
|
Теперь каждый раз, когда активируется окружение "myenv", будет устанавливаться переменная DEBUG=True.
Автоматическая установка зависимостей
Для тех, кто хочет максимальной автоматизации, можно использовать сочетание pyenv с инструментами наподобие direnv:
1. Установите direnv (например, brew install direnv на macOS)
2. Настройте интеграцию с вашей оболочкой
3. Создайте файл .envrc в директории проекта:
| Bash | 1
2
3
| # .envrc
layout pyenv 3.10.4
pip install -r requirements.txt > /dev/null 2>&1 |
|
Теперь при входе в директорию проекта automatically будет активирована нужная версия Python и установлены все зависимости!
Стратегии mirroring для ускорения работы
Установка новых версий Python через pyenv может занимать время, особенно если вы часто устанавливаете одни и те же версии на разных машинах или в CI/CD. К счастью, существуют способы ускорить этот процесс.
Кэширование исходников
По умолчанию pyenv скачивает исходный код Python при каждой установке. Можно сэкономить время, сохранив эти архивы:
| Bash | 1
2
3
4
5
6
| # Скачиваем исходники без установки
mkdir -p $(pyenv root)/cache
curl -o $(pyenv root)/cache/Python-3.10.4.tar.xz https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tar.xz
# Теперь pyenv использует локальный кэш при установке
pyenv install 3.10.4 |
|
Использование предкомпилированных бинарников
Для macOS существует отличный проект pyenv-installer, который использует предкомпилированные бинарники вместо сборки из исходников:
| Bash | 1
2
3
4
5
| # Установка pyenv-installer
brew install pyenv-installer
# Установка Python через предкомпилированные бинарники
pyenv-installer install 3.10.4 |
|
Это может ускорить установку в 5-10 раз (примерно).
Создание зеркала pyenv-репозитория
Для команд с несколькими разработчиками или для оптимизации CI/CD можно создать локальное зеркало репозитория pyenv:
| Bash | 1
2
3
4
5
| # Клонируем репозиторий pyenv
git clone https://github.com/pyenv/pyenv.git /path/to/mirror/pyenv
# Используем зеркало для установки
PYENV_GIT_REMOTE=/path/to/mirror/pyenv pyenv update |
|
Такое зеркало особенно полезно в средах с ограниченным доступом к интернету или при высоких требованиях к производительности.
Создание кастомных сборок Python
Одна из малоизвестных, но полезных возможностей pyenv — это создание кастомных сборок Python. Стандартная установка через pyenv install использует предопределённые конфигурации, но что если вам нужны специфические опции компиляции? Допустим, вы работаете над проектом, где производительность критична. В этом случае имеет смысл собрать Python с агрессивными оптимизациями:
| Bash | 1
| PYTHON_CONFIGURE_OPTS="--enable-optimizations --with-lto" PYTHON_CFLAGS="-march=native -O3" pyenv install 3.10.4 |
|
Эта команда создаст версию Python, оптимизированную специально для вашего процессора, что может дать прирост производительности до 20%. Особенно заметна разница при работе с вычислительно-ёмкими задачами вроде машинного обучения. Для тех, кто работает с профилированием и отладкой, может быть полезна сборка с символами отладки:
| Bash | 1
| PYTHON_CONFIGURE_OPTS="--with-pydebug" pyenv install 3.10.4-debug |
|
С такой сборкой отладчики вроде gdb будут значительно информативнее.
Работа с альтернативными реализациями Python
Помимо стандартного CPython, pyenv поддерживает установку альтернативных реализаций Python, включая PyPy (с JIT-компиляцией), Anaconda (для научных вычислений), Stackless Python и другие. Например, для проектов, требующих высокой производительности, PyPy может быть отличным выбором:
| Bash | 1
2
| pyenv install pypy3.9-7.3.9
pyenv local pypy3.9-7.3.9 |
|
PyPy часто показывает скорость в 3-5 раз выше CPython для долгоживущих процессов, хотя и имеет свои ограничения по совместимости с некоторыми C-расширениями. Для работы с данными и ML-проектов Anaconda предоставляет богатую экосистему предустановленных библиотек:
| Bash | 1
2
| pyenv install anaconda3-2022.05
pyenv local anaconda3-2022.05 |
|
Использование pyenv с Docker
Если ваш проект использует контейнеры Docker, pyenv может быть интегрирован и туда. Вот пример Dockerfile, использующего pyenv:
| Bash | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| FROM debian:bullseye-slim
# Установка зависимостей
RUN apt-get update && apt-get install -y \
build-essential curl git libffi-dev libssl-dev \
zlib1g-dev libreadline-dev libbz2-dev libsqlite3-dev
# Установка pyenv
RUN curl [url]https://pyenv.run[/url] | bash
ENV PYENV_ROOT /root/.pyenv
ENV PATH $PYENV_ROOT/bin:$PATH
RUN eval "$(pyenv init --path)"
# Установка нужных версий Python
RUN pyenv install 3.10.4
RUN pyenv global 3.10.4
# Остальные шаги сборки образа
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"] |
|
Это удобно, когда нужны специфические версии Python, которых нет в стандартных образах Docker, или если хочется использовать точно те же версии, что и в разработке.
Кастомизация pyenv с плагинами
Экосистема pyenv включает множество плагинов, расширяющих его функциональность. Мы уже упоминали pyenv-virtualenv, но есть и другие интересные:
pyenv-doctor: диагностика проблем с установкой pyenv
pyenv-update: обновление pyenv и установленных плагинов
pyenv-which-ext: поиск исполняемых файлов в виртуальных окружениях
Установка плагина обычно сводится к клонированию его репозитория в директорию plugins:
| Bash | 1
| git clone https://github.com/pyenv/pyenv-doctor.git $(pyenv root)/plugins/pyenv-doctor |
|
После установки плагин становится доступен как подкоманда pyenv:
Комбинируя различные плагины, вы можете создать среду разработки, идеально подходящую под ваши потребности и рабочие процессы.
Возможные проблемы и их решения
Несмотря на всю элегантность и мощь pyenv, как и в любом сложном инструменте, иногда возникают подводные камни. Давайте рассмотрим типичные проблемы и способы их решения — это может сэкономить вам часы отладки и гуглинга.
Типичные ошибки настройки
Одна из самых распространенных проблем — pyenv установлен, но команды не работают или система продолжает использовать системный Python. Почти всегда это связано с некорректной настройкой переменных окружения и PATH.
Если вы видите что-то вроде command not found: pyenv или pyenv: no such file or directory, проверьте, что строки инициализации pyenv действительно добавлены в конфигурационный файл вашей оболочки. Также убедитесь, что вы перезапустили терминал или применили изменения через source.
Ещё один момент — порядок путей в PATH. Pyenv работает за счёт размещения своих shim-скриптов в начале PATH. Если другие пути к Python стоят в PATH раньше, pyenv не сможет перехватить вызовы:
| Bash | 1
2
3
4
5
| # Проверьте порядок путей
echo $PATH
# Путь к pyenv должен быть в начале
# Должно быть что-то вроде /home/username/.pyenv/bin:/home/username/.pyenv/shims:... |
|
Если вы используете ИДЕ вроде VS Code или PyCharm, они могут игнорировать настройки pyenv и использовать системный Python. Решение — настроить путь к интерпретатору в настройках IDE, явно указав на версию, управляемую pyenv.
Проблемы при компиляции Python
При установке новых версий Python иногда возникают ошибки компиляции. Чаще всего это из-за отсутствия необходимых библиотек разработки. Частые ошибки выглядят примерно так:
| Bash | 1
2
3
| ERROR: The Python zlib extension was not compiled. Missing the zlib?
ERROR: The Python bz2 module is not compiled. Missing the bzip2 headers?
ERROR: The Python readline extension was not compiled. Missing the readline lib? |
|
Решение для большинства Linux-дистрибутивов — установить пакеты разработчика. Например, для Ubuntu:
| Bash | 1
2
3
4
5
| sudo apt-get update
sudo apt-get install -y build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev \
liblzma-dev python-openssl |
|
На macOS с Homebrew:
| Bash | 1
| brew install openssl readline sqlite3 xz zlib tcl-tk |
|
Если проблемы продолжаются, полезный трюк — использовать переменную среды CFLAGS для явного указания путей к заголовочным файлам:
| Bash | 1
2
3
| CFLAGS="-I$(brew --prefix openssl)/include -I$(brew --prefix readline)/include -I$(brew --prefix zlib)/include" \
LDFLAGS="-L$(brew --prefix openssl)/lib -L$(brew --prefix readline)/lib -L$(brew --prefix zlib)/lib" \
pyenv install 3.9.12 |
|
Особенности совместимости с другими инструментами
Pyenv иногда конфликтует с другими инструментами управления Python-окружениями, такими как Anaconda или системные менеджеры пакетов.
Pyenv и Anaconda
Если у вас установлена Anaconda до pyenv, сначала лучше деактивировать Anaconda, настроить pyenv, и только потом устанавливать версию Anaconda через pyenv:
| Bash | 1
2
3
4
5
6
7
8
| # Деактивируем Anaconda
conda deactivate
# Настраиваем pyenv
[H2]...[/H2]
# Устанавливаем Anaconda через pyenv
pyenv install anaconda3-2022.05 |
|
Pyenv и менеджеры пакетов
Если ваш дистрибутив Linux использует Python для системных утилит, будьте осторожны с установкой глобальной версии pyenv. Лучше оставить системную версию Python нетронутой для системных нужд, а для разработки использовать локальные версии в конкретных проектах.
Проблемы с обновлением pyenv
Pyenv иногда может "застрять" на старой версии, даже если вы обновили сам pyenv. Это обычно происходит из-за устаревшего кэша shims:
| Bash | 1
2
3
4
5
| # Обновляем pyenv
cd $(pyenv root) && git pull
# Перестраиваем shims
pyenv rehash |
|
Если вы используете плагины pyenv, не забудьте обновить и их:
| Bash | 1
2
| # Обновляем pyenv-virtualenv
cd $(pyenv root)/plugins/pyenv-virtualenv && git pull |
|
Проблемы с SSL и сетевыми сертификатами
Иногда после установки Python через pyenv вы можете столкнуться с ошибками SSL при попытке использовать pip или другие инструменты, работающие с сетью:
| Bash | 1
| ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed |
|
Это часто случается на macOS, где Python, установленный через pyenv, не имеет доступа к системному хранилищу сертификатов. Решение:
| Bash | 1
2
3
4
5
| # Для macOS
open /Applications/Python\ 3.x/Install\ Certificates.command
# Или вручную
pip install --upgrade certifi |
|
Слишком много версий Python и занятое место на диске
Со временем может накопиться множество установленных версий Python, занимающих значительное пространство на диске. Для управления этим можно использовать:
| Bash | 1
2
3
4
5
6
| # Просмотр всех установленных версий
pyenv versions
# Удаление ненужных версий
pyenv uninstall 3.8.5
pyenv uninstall 3.9.1 |
|
Или даже написать скрипт для очистки всех неиспользуемых версий:
| Bash | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #!/bin/bash
# Получаем список всех активных версий из локальных и глобальных настроек
active_versions=$(find $(pyenv root) -name .python-version -exec cat {} \; | sort -u)
active_versions+=" $(pyenv global)"
# Получаем список всех установленных версий
all_versions=$(pyenv versions --bare)
# Удаляем неиспользуемые версии
for version in $all_versions; do
if [[ ! "$active_versions" =~ "$version" ]]; then
echo "Removing unused Python version: $version"
pyenv uninstall -f $version
fi
done |
|
Pyenv в наборе инструментов Python-разработки
Pyenv не единственное решение — есть и альтернативы.
Conda (и Miniconda) представляет собой не только менеджер версий Python, но и систему управления пакетами. Conda хорошо подходит для научных вычислений и проектов с нестандартными зависимостями (особенно C/C++ библиотеками), но может быть избыточным для веб-разработки или небольших проектов.
Dockerized Python — подход, при котором каждый проект запускается в своём контейнере с нужной версией Python. Это обеспечивает полную изоляцию не только на уровне Python, но и на уровне операционной системы, что подходит для производственных сред, но может создавать дополнительную сложность в процессе разработки.
Встроенные вируальные окружения Python (venv) отлично справляются с изоляцией зависимостей, но не решают проблему управления версиями самого интерпретатора.
Когда же pyenv становится незаменимым? Опыт показывает, что pyenv особенно ценен в следующих ситуациях:- При работе с несколькими проектами, требующими разных версий Python.
- В командах, где нужно гарантировать единообразие окружения разработки.
- При необходимости быстро тестировать код на разных версиях Python.
- Для разработчиков библиотек, обеспечивающих совместимость с несколькими версиями Python.
Резюмирую: pyenv — это инструмент, который решает конкретную проблему и делает это хорошо. Он не претендует на роль универсального решения для управления Python-средами, но в своей нише — управлении версиями интерпретатора — pyenv является стандартом, благодаря своей простоте, надёжности и интеграции с экосистемой Python.
Распознавание лиц: Python + Arduino (Управление Servo+Arduino из Python+OpenCV) Приветствую всех ГУРУ и тех кому не безразлична данная тема.
Пытаюсь сделать трекер лица Python+OpenCV --> Arduino+Servo
Для Ардуино... Управление потоками в Python С использованием многопоточности для заданного значения найти сумму ряда с точностью
члена ряда по абсолютному значению ε= 10^-7 и произвести... Управление потоками в Python С использованием многопоточности для заданного значения найти сумму ряда с точностью
члена ряда по абсолютному значению ε= 10^-7 и... Управление потоками в Python(2) С использованием многопоточности для заданного значения найти сумму ряда с точностью
члена ряда по абсолютному значению ε= 10^-7 и произвести... Python daemon управление GPIO Делаю робота на базе одноплатника NanoPi2, опарационка Debian
Примеров довольно мало поэтому приходится колхозить.
Требуется сделать программный... Управление приложениями через Python здравствуйте.
каким образом можно управлять различными программами через питон.
хочу написать программу для смарта для удаленного управления... Управление ИБП через порт с помощью модуля serial Здравствуйте! У меня есть бесперебойник я нашёл команды через которые можно с ним общаться, конектюсь с ним через ttyS0. Через программу nut все... Управление генератором SI5153 c помощью платы Raspberry Pi Pico Есть такой код на Python, который должен задавать частоту генератора, но всё работает абсолютно неправильно. Первый раз сталкиваюсь с... Управление python приложением через сайт Здравствуйте, тут вроде как и python, так и серверная часть, поэтому не знал точно в какой теме задавать вопрос. Появилась идея сделать один проект.... Управление музыкой Windows через Python Пишу утилиту управления музыкой, которая работает на Python. Подскажите пожалуйста, как возможно поставить на паузу? Включить воспроизведение? На... Парсинг с помощью Python from urllib2 import urlopen
u = urlopen(user_url) ... Построение графов с помощью Python Господа - помогите пожалуйста изменить данный код, нужно очень срочно (до 15:00 сегодня), а я не понимаю как.
Задание:
1. Составить модуль,...
|