Python: установка пакетов без PyPI в изолированной среде разработки

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Python-разработчики, работающие в изолированных средах без доступа к интернету
  • Студенты и начинающие разработчики, заинтересованные в освоении навыков работы с Python и виртуальными окружениями
  • IT-специалисты, работающие в области DevOps и безопасности, нуждающиеся в знании локальной установки пакетов

    Работа в изолированной среде без доступа к интернету перестала быть редкостью для Python-разработчиков. Будь то проект в закрытом корпоративном контуре, разработка на борту самолета или локальная среда с повышенными требованиями к безопасности — умение устанавливать пакеты без PyPI становится критически важным навыком. Виртуальные окружения в сочетании с локальной установкой пакетов образуют мощный тандем для создания переносимых и изолированных сред разработки. Разберем, как правильно организовать этот процесс с максимальной эффективностью. 🚀

Хотите освоить Python и стать востребованным разработчиком? Наш курс Обучение Python-разработке от Skypro даст вам не только теоретическую базу, но и практические навыки работы с инструментами экосистемы Python. Вы научитесь эффективно использовать virtualenv, pip и другие инструменты, необходимые для профессиональной разработки. Наши студенты начинают создавать рабочие проекты уже с первых месяцев обучения!

Создание и активация виртуального окружения Python

Виртуальное окружение — это изолированное пространство, где Python и установленные пакеты существуют независимо от глобальной системы и других проектов. Это решает проблему конфликтов зависимостей между разными проектами и упрощает перенос среды разработки.

Начнем с создания виртуального окружения с помощью встроенного модуля venv (для Python 3.3+) или внешнего пакета virtualenv:

Алексей Петров, DevOps-инженер

В прошлом году я столкнулся с необходимостью настроить среду разработки в закрытом контуре банка. Система безопасности запрещала любые внешние подключения, включая PyPI. Мое первое действие — создание виртуального окружения для изоляции проекта:

Для Python 3.8, которым мы пользовались, я применил:

python -m venv bank_project_env

Это создало директорию с копией интерпретатора и пустой библиотекой пакетов. Затем активировал окружение:

# Windows
bank_project_env\Scripts\activate

# Linux/macOS
source bank_project_env/bin/activate

После активации в командной строке появился префикс (bankprojectenv), что подтвердило: я работаю в изолированной среде. Это стало основой для дальнейшей настройки проекта без доступа к интернету.

Существует несколько способов создания виртуальных окружений в Python в зависимости от вашей версии Python и предпочтений:

Инструмент Команда создания Особенности
venv (Python 3.3+) python -m venv myenv Встроенный модуль, не требует дополнительной установки
virtualenv virtualenv myenv Поддерживает Python 2 и 3, больше опций настройки
pipenv pipenv shell Объединяет управление пакетами и виртуальными окружениями
conda conda create -n myenv python=3.9 Менеджер пакетов и окружений для научных вычислений

После создания виртуального окружения, его необходимо активировать:

  • Windows: myenv\Scripts\activate
  • Linux/macOS: source myenv/bin/activate
  • Fish shell: source myenv/bin/activate.fish

Признаком активации служит изменение приглашения командной строки, которое теперь будет содержать название виртуального окружения в скобках, например: (myenv) C:\Projects>

После активации все операции с pip будут выполняться только в контексте данного окружения, не затрагивая глобальную систему. 🔒

Пошаговый план для смены профессии

Подготовка локальных пакетов для установки через pip

Для установки пакетов в offline-режиме необходимо сначала получить их в виде файлов. Существует несколько форматов пакетов Python:

  • Wheel (.whl) — бинарный формат, содержащий уже скомпилированный код и ресурсы.
  • Source distribution (.tar.gz) — архив с исходным кодом пакета.
  • Локальный каталог с файлом setup.py — исходный код пакета в неупакованном виде.

Существует несколько способов получить локальные копии пакетов для последующей установки:

Команды pip для установки из локальных wheel-файлов

Wheel-файлы (.whl) — предпочтительный формат для локальной установки, так как они не требуют компиляции и устанавливаются быстрее. После активации виртуального окружения установка wheel-файла выполняется командой:

pip install /path/to/package-1.0-py3-none-any.whl

Можно также установить несколько wheel-файлов одной командой:

pip install /path/to/package1.whl /path/to/package2.whl

Если wheel-файлы находятся в одной директории, удобно использовать шаблоны оболочки:

pip install /path/to/wheels/*.whl

При работе с wheel-файлами важно учитывать их совместимость с вашей платформой и версией Python. Wheel-файл содержит маркеры в имени, указывающие на совместимость:

Часть имени Пример Значение
Имя пакета numpy Название пакета Python
Версия 1.21.0 Версия пакета
Python-тег cp39 Версия Python (CPython 3.9)
ABI-тег cp39 Совместимость с ABI Python
Платформа win_amd64 Операционная система и архитектура

Например, файл numpy-1.21.0-cp39-cp39-win_amd64.whl предназначен для установки в Python 3.9 на Windows с архитектурой AMD64.

При использовании колеса с несовместимыми метками вы получите ошибку. Для ее обхода можно использовать флаг --no-deps, который отключает проверку зависимостей:

pip install --no-deps /path/to/package.whl

Однако помните, что этот подход может привести к неработоспособности пакета, если необходимые зависимости отсутствуют. Используйте его с осторожностью! ⚠️

Установка пакетов из исходников и tar.gz архивов

Если wheel-файлы недоступны, можно использовать исходные дистрибутивы (.tar.gz) или непосредственно каталоги с исходным кодом:

Мария Соколова, Python-разработчик

На проекте по анализу данных в условиях ограниченного доступа к сети я столкнулась с необходимостью установить несколько data science библиотек из исходников. Особенно запомнился случай с установкой scipy:

  1. Сначала я попробовала скачать и установить .tar.gz архив:
pip install /downloads/scipy-1.7.3.tar.gz

Но столкнулась с ошибкой из-за отсутствия компилятора C. После установки необходимых системных зависимостей (компиляторы gcc и gfortran) и нескольких Python-пакетов я создала скрипт, который последовательно устанавливал пакеты с учетом их зависимостей:

pip install /downloads/numpy-1.21.0.tar.gz
pip install /downloads/scipy-1.7.3.tar.gz

Для ускорения компиляции я добавила параметр:

pip install /downloads/scipy-1.7.3.tar.gz --global-option=build_ext --global-option=-j4

Этот опыт научил меня всегда иметь заранее скачанные wheel-файлы для сложных библиотек, чтобы избежать проблем с компиляцией в offline-режиме.

Для установки пакета из tar.gz архива используйте команду:

pip install /path/to/package-1.0.tar.gz

При установке из tar.gz архива pip выполняет следующие действия:

  1. Распаковывает архив во временную директорию
  2. Запускает скрипт setup.py для сборки и установки пакета
  3. Компилирует исходный код, если пакет содержит расширения на C, C++ или других языках

Для установки из локальной директории с исходным кодом (содержащей setup.py):

pip install -e /path/to/package/

Флаг -e (или --editable) устанавливает пакет в режиме "разработки", создавая ссылку на исходный код вместо копирования файлов. Это полезно при разработке пакета, так как изменения в коде будут немедленно доступны без переустановки. 🔄

Если при установке из исходников возникают проблемы с компиляцией, может потребоваться установить дополнительные системные зависимости:

  • Linux: компиляторы (gcc, g++), библиотеки разработки, Python-dev пакеты
  • Windows: Visual C++ Build Tools, соответствующие вашей версии Python
  • macOS: Xcode Command Line Tools, Homebrew для установки дополнительных библиотек

Решение проблем с зависимостями при локальной установке

Самая сложная часть offline-установки — обеспечение всех зависимостей пакета. Рассмотрим стратегии решения этой проблемы.

Первым шагом рекомендуется создать локальный кеш всех необходимых пакетов. Для этого на компьютере с доступом в интернет выполните:

pip download -d /path/to/local-packages package_name

Эта команда скачает указанный пакет и все его зависимости в указанную директорию. Для создания полного набора пакетов на основе requirements.txt:

pip download -d /path/to/local-packages -r requirements.txt

Когда у вас есть локальный кеш пакетов, вы можете установить их в виртуальное окружение, указав директорию с пакетами как источник:

pip install --no-index --find-links=/path/to/local-packages package_name

Для установки всех пакетов из requirements.txt:

pip install --no-index --find-links=/path/to/local-packages -r requirements.txt

Если у вас возникают сложности с зависимостями, попробуйте следующие решения:

  • Использование pip-tools для создания "закрепленных" (pinned) зависимостей с точными версиями
  • Создание локального PyPI-сервера с помощью таких инструментов, как devpi или pypiserver
  • Использование pip-offline-install для автоматизации процесса offline-установки

При работе со сложными зависимостями полезно использовать инструменты анализа зависимостей для создания правильного порядка установки:

pip install pipdeptree

pipdeptree -p package_name

Это поможет визуализировать дерево зависимостей и выявить потенциальные конфликты.

Кроме того, полезно знать флаги pip, которые помогают при решении проблем с зависимостями:

  • --no-deps – установка пакета без зависимостей
  • --no-build-isolation – отключение изоляции сборки (может помочь при сложных зависимостях сборки)
  • --ignore-installed – игнорирование уже установленных пакетов
  • --force-reinstall – принудительная переустановка пакетов

Для лучшей организации пакетов в offline-среде рекомендую структурировать вашу локальную директорию с пакетами по назначению и версиям Python. Это упростит управление большими наборами пакетов и улучшит воспроизводимость окружений. 🗂️

Овладение техниками offline-установки пакетов Python в виртуальные окружения — фундаментальный навык для профессионального разработчика. Это не просто решение проблемы отсутствия интернета, а путь к созданию полностью контролируемых, воспроизводимых и переносимых сред разработки. Применяя описанные методы, вы сможете гарантировать стабильность своих проектов независимо от внешних условий и обстоятельств. Полученные знания особенно ценны для критически важных систем, где надёжность и предсказуемость работы кода приоритетнее скорости разработки.

Загрузка...