Python: установка пакетов без PyPI в изолированной среде разработки
Для кого эта статья:
- 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:
- Сначала я попробовала скачать и установить .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 выполняет следующие действия:
- Распаковывает архив во временную директорию
- Запускает скрипт setup.py для сборки и установки пакета
- Компилирует исходный код, если пакет содержит расширения на 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 в виртуальные окружения — фундаментальный навык для профессионального разработчика. Это не просто решение проблемы отсутствия интернета, а путь к созданию полностью контролируемых, воспроизводимых и переносимых сред разработки. Применяя описанные методы, вы сможете гарантировать стабильность своих проектов независимо от внешних условий и обстоятельств. Полученные знания особенно ценны для критически важных систем, где надёжность и предсказуемость работы кода приоритетнее скорости разработки.