Python: установка пакетов в изолированной среде без интернета
Для кого эта статья:
- Python-разработчики, работающие в корпоративной среде с ограниченным доступом к интернету
- DevOps-специалисты, ответственные за управление зависимостями в изолированных системах
IT-менеджеры и системные администраторы, занимающиеся настройкой и поддержкой локальных репозиториев пакетов
Мир корпоративной разработки Python полон ограничений и "красных зон" — закрытые сети, запрет на внешние подключения, строгие политики безопасности. Установка необходимых пакетов превращается в настоящий квест, когда доступа к PyPI просто нет. Что делать, если ваш
requirements.txtесть, а интернета — нет? Как подготовить локальное хранилище пакетов для надёжных развёртываний? Разбираемся в деталях управления зависимостями Python в условиях изоляции и корпоративных ограничений. 🔒🐍
Если вы регулярно сталкиваетесь с задачами управления Python-зависимостями в сложных средах, возможно, вам пора глубже погрузиться в профессиональную разработку. Обучение Python-разработке от Skypro — это практические навыки работы с реальными проектами, включая профессиональный DevOps, управление зависимостями и создание отказоустойчивых приложений. Всего за 9 месяцев вы станете специалистом, способным решать самые сложные задачи Python-разработки.
Основные способы установки пакетов из requirements.txt
Файл requirements.txt — краеугольный камень управления зависимостями в Python-проектах. Он содержит список необходимых пакетов, часто с указанием конкретных версий, что обеспечивает стабильность и воспроизводимость среды разработки или продакшена.
Стандартный подход к установке зависимостей предельно прост:
pip install -r requirements.txt
Однако эта команда предполагает наличие доступа к PyPI — официальному репозиторию пакетов Python. В корпоративных или изолированных средах такая роскошь доступна не всегда.
Рассмотрим основные способы установки пакетов из requirements.txt с учётом различных сценариев доступности интернета:
| Сценарий | Команда | Примечания |
|---|---|---|
| Полный доступ к интернету | pip install -r requirements.txt | Стандартный вариант, пакеты загружаются напрямую с PyPI |
| Ограниченный доступ (корпоративный прокси) | pip install --proxy=http://proxy:port -r requirements.txt | Установка через корпоративный прокси-сервер |
| Локальный каталог с пакетами | pip install --no-index --find-links=./packages -r requirements.txt | Использование предварительно загруженных пакетов из локального каталога |
| Локальный PyPI-сервер | pip install -i http://local-pypi-server/simple -r requirements.txt | Установка из локального зеркала PyPI |
| Полная офлайн-среда | pip install --no-index --find-links=./wheels -r requirements.txt | Требует предварительной подготовки всех wheel-файлов |
Важно понимать, что в некоторых случаях вам может понадобиться не только локальный requirements.txt, но и локальные копии самих пакетов. Это особенно актуально для полностью изолированных сред.
Александр Петров, DevOps-инженер
Недавно столкнулся с задачей развертывания Python-приложения на изолированных серверах атомной станции. Никакого доступа к интернету, даже через прокси. Первая попытка была наивной — просто скопировал код и
requirements.txt, запустилpip installи... ничего. Pip пытался достучаться до PyPI и терпел неудачу.Решение оказалось не таким очевидным. Сначала на машине с интернетом я скачал все необходимые пакеты вместе с зависимостями:
pip download -r requirements.txt -d ./packages.Затем перенёс эту директорию на целевые серверы вместе с кодом проекта. И уже там использовал команду:
pip install --no-index --find-links=./packages -r requirements.txtЭто сработало идеально! Теперь у нас есть автоматизированный процесс для обновления пакетов. Каждую неделю мы обновляем локальное хранилище на "чистой" машине и доставляем его на изолированные серверы.
Дополнительно стоит отметить несколько полезных флагов pip при установке из requirements.txt:
--upgradeили-U— обновление уже установленных пакетов до версий, указанных вrequirements.txt--ignore-installed— игнорировать уже установленные пакеты и переустановить их--no-deps— не устанавливать зависимости пакетов (опасно, используйте с осторожностью)--require-hashes— проверять хеши пакетов для обеспечения безопасности

Параметры pip install для работы с локальными источниками
При работе в ограниченной среде критически важно уметь гибко настраивать pip для использования локальных источников пакетов. Умелое использование параметров pip позволяет решить большинство проблем с установкой в изолированной среде. 🛠️
Ключевые параметры pip для работы с локальными источниками:
--no-index— запрещает pip обращаться к внешним индексам пакетов (включая PyPI)--find-links PATHили-f PATH— указывает директорию или URL, где искать пакеты--index-url URLили-i URL— задаёт альтернативный индекс пакетов вместо PyPI--extra-index-url URL— добавляет дополнительный индекс пакетов (используется вместе с основным)--trusted-host HOST— помечает хост как доверенный (обходит проверки SSL)
Рассмотрим несколько практических примеров использования этих параметров:
- Установка пакетов исключительно из локального каталога:
pip install --no-index --find-links=./downloaded_packages -r requirements.txt
- Использование локального зеркала PyPI с отключенной проверкой SSL:
pip install --index-url http://local-pypi-mirror/simple --trusted-host local-pypi-mirror -r requirements.txt
- Комбинирование локального каталога и индекса:
pip install --index-url http://local-pypi/simple --find-links=./fallback_packages -r requirements.txt
- Указание нескольких локальных директорий для поиска пакетов:
pip install --no-index --find-links=./packages1 --find-links=./packages2 -r requirements.txt
Ирина Соколова, Lead Python-разработчик
В нашем банке доступ к внешнему интернету есть только у одного сервера в DMZ-зоне, а остальные серверы разработки находятся в закрытом контуре. Однажды нам нужно было срочно обновить библиотеки для ML-проекта — около 50 пакетов с сотнями зависимостей.
Сначала казалось, что задача трудновыполнима. Мы попробовали вручную выкачать все пакеты, но быстро запутались в зависимостях. Тогда я разработала двухэтапный подход:
На сервере с доступом в интернет создала
pip.confс настройкой для сохранения всех скачиваемых пакетов:[global] download-cache = /path/to/pip/cacheЗатем выполнила:
pip download -r requirements.txt -d ./project_packagesЭто скачало все пакеты с зависимостями. После перенесла каталог на целевой сервер и установила:
pip install --no-index --find-links=./project_packages -r requirements.txtТеперь этот процесс у нас полностью автоматизирован с помощью Jenkins-пайплайна, который еженедельно обновляет локальное хранилище пакетов и раздает их по всем серверам разработки.
Важный нюанс: параметр --find-links не заменяет полностью индекс пакетов. Если вы хотите полностью исключить обращение к PyPI или другим внешним источникам, всегда комбинируйте его с флагом --no-index.
| Параметр | Требует интернета | Применение | Совместимость |
|---|---|---|---|
--no-index | Нет | Полностью изолированные среды | Требует --find-links |
--find-links | Нет | Локальные директории с пакетами | Работает с и без --no-index |
--index-url | Да (локальная сеть) | Корпоративные PyPI-зеркала | Заменяет стандартный PyPI |
--extra-index-url | Да (локальная сеть) | Дополнительные источники пакетов | Дополняет основной индекс |
--trusted-host | Зависит от хоста | Локальные HTTP-серверы без SSL | Часто используется с --index-url |
Создание локального каталога пакетов для offline-установки
Для полностью изолированных сред критически важно уметь создавать локальное хранилище пакетов Python. Это позволяет устанавливать зависимости даже при полном отсутствии доступа к внешним репозиториям. 📦
Процесс создания локального каталога пакетов обычно выполняется на машине с доступом в интернет, а затем результат переносится в изолированную среду. Рассмотрим поэтапно этот процесс:
Шаг 1: Подготовка среды для скачивания пакетов Создайте директорию для хранения пакетов:
mkdir -p ./python_packages
Шаг 2: Скачивание пакетов с зависимостями
Для скачивания всех пакетов, указанных в requirements.txt, вместе с их зависимостями используйте команду:
pip download -r requirements.txt -d ./python_packages
Это скачает все необходимые wheel-файлы и исходные архивы пакетов.
Шаг 3: Опционально: скачивание конкретной версии Python Если вам также нужно установить Python в изолированной среде, скачайте официальные установщики или исходный код с сайта python.org.
Шаг 4: Перенос пакетов в изолированную среду
Скопируйте директорию ./python_packages в целевую изолированную среду с помощью физических носителей, защищенной сети или других доступных средств.
Шаг 5: Установка пакетов в изолированной среде В изолированной среде выполните команду:
pip install --no-index --find-links=./python_packages -r requirements.txt
Важно учитывать несколько нюансов при создании локального каталога пакетов:
- Для платформозависимых пакетов (например, с компилируемым C-кодом) необходимо скачивать wheel-файлы, совместимые с целевой платформой
- Если вы используете разные версии Python в исходной и целевой среде, убедитесь, что скачиваете совместимые пакеты
- Для некоторых пакетов может потребоваться дополнительное скачивание системных зависимостей
Для более сложных случаев можно использовать специализированные инструменты:
- pip-tools — для более точного разрешения зависимостей
- conda-pack — если вы используете Anaconda/Miniconda
- pipenv — для проектов, использующих Pipenv для управления зависимостями
- poetry — для экспорта зависимостей из проектов Poetry
Дополнительно можно оптимизировать процесс, используя кэширование пакетов:
pip download --cache-dir=./pip_cache -r requirements.txt -d ./python_packages
Это создаст локальный кэш, который можно использовать при последующих скачиваниях, что особенно полезно при регулярных обновлениях пакетов.
Настройка pip для использования локальных репозиториев
Вместо разовой передачи отдельных пакетов, более масштабное решение — настройка локального зеркала PyPI или частного репозитория пакетов. Это идеальный подход для команд разработки в корпоративных средах. 🏢
Настройка pip для работы с локальными репозиториями может быть выполнена несколькими способами:
- Использование конфигурационных файлов pip
- Настройка через переменные окружения
- Использование командной строки с сохранением параметров
Рассмотрим каждый из этих подходов подробнее:
1. Конфигурационные файлы pip
Создайте или отредактируйте файл pip.conf (Linux/macOS) или pip.ini (Windows):
Для Linux/macOS: ~/.config/pip/pip.conf или ~/.pip/pip.conf
Для Windows: %APPDATA%\pip\pip.ini или %USERPROFILE%\pip\pip.ini
Добавьте следующие настройки:
[global]
index-url = http://local-pypi-server/simple
trusted-host = local-pypi-server
no-index = false
find-links = /path/to/local/packages
Этот файл конфигурации указывает pip использовать локальный PyPI-сервер вместо официального репозитория и дополнительно искать пакеты в указанной директории.
2. Переменные окружения Вы можете задать конфигурацию pip через переменные окружения:
Linux/macOS:
export PIP_INDEX_URL=http://local-pypi-server/simple
export PIP_TRUSTED_HOST=local-pypi-server
export PIP_FIND_LINKS=/path/to/local/packages
Windows:
set PIP_INDEX_URL=http://local-pypi-server/simple
set PIP_TRUSTED_HOST=local-pypi-server
set PIP_FIND_LINKS=C:\path\to\local\packages
3. Создание алиаса или скрипта Для частого использования удобно создать алиас или скрипт:
Linux/macOS:
alias pip_local='pip install --index-url http://local-pypi-server/simple --trusted-host local-pypi-server'
# Использование: pip_local -r requirements.txt
Windows (batch-файл pip_local.bat):
@echo off
pip install --index-url http://local-pypi-server/simple --trusted-host local-pypi-server %*
Для корпоративных сред можно создать локальный PyPI-сервер, используя одно из следующих решений:
- PyPI-Server — простое и легкое решение для локального зеркала
- Devpi — продвинутый инструмент с поддержкой кэширования и репликации
- Artifactory — корпоративное решение для хранения артефактов, включая Python-пакеты
- Nexus Repository — мощная система управления артефактами с поддержкой PyPI
- Gitlab Package Registry — интеграция с системой контроля версий
Пример настройки простого PyPI-сервера с помощью pypi-server:
- Установите
pypi-server:
pip install pypiserver
- Создайте директорию для пакетов:
mkdir -p /path/to/packages
- Скачайте пакеты в эту директорию:
pip download -r requirements.txt -d /path/to/packages
- Запустите сервер:
pypi-server -p 8080 /path/to/packages
- Настройте pip на использование этого сервера:
pip install --index-url http://localhost:8080/simple --trusted-host localhost -r requirements.txt
Автоматизация установки пакетов в изолированных средах
Ручная настройка установки пакетов приемлема для разовых операций, но в масштабируемых средах необходима автоматизация. Правильно настроенная автоматизация экономит время, снижает количество ошибок и обеспечивает воспроизводимость среды. 🤖
Рассмотрим несколько подходов к автоматизации установки Python-пакетов в изолированных средах:
- Скрипты для подготовки и передачи пакетов
- Использование Docker для изолированных сред
- Интеграция с системами CI/CD
- Автоматическое обновление локальных репозиториев
1. Автоматизация с помощью скриптов Создайте скрипт для автоматической загрузки и подготовки пакетов:
#!/bin/bash
# Определение переменных
REQUIREMENTS_FILE="requirements.txt"
PACKAGES_DIR="./python_packages"
TARGET_ENV="production"
# Создание директории для пакетов
mkdir -p $PACKAGES_DIR
# Загрузка пакетов
echo "Downloading packages to $PACKAGES_DIR..."
pip download -r $REQUIREMENTS_FILE -d $PACKAGES_DIR
# Архивирование пакетов для передачи
echo "Creating archive for transfer..."
tar -czvf ${TARGET_ENV}_python_packages.tar.gz $PACKAGES_DIR
echo "Package archive ready for transfer!"
И соответствующий скрипт для установки на изолированном сервере:
#!/bin/bash
# Определение переменных
ARCHIVE_NAME="production_python_packages.tar.gz"
PACKAGES_DIR="./python_packages"
REQUIREMENTS_FILE="requirements.txt"
# Распаковка архива
echo "Extracting packages..."
tar -xzvf $ARCHIVE_NAME
# Установка пакетов
echo "Installing packages from local directory..."
pip install --no-index --find-links=$PACKAGES_DIR -r $REQUIREMENTS_FILE
echo "Installation complete!"
2. Docker для изолированных сред Создайте многоэтапный Dockerfile для подготовки и использования локальных пакетов:
# Первый этап: загрузка пакетов
FROM python:3.9 AS builder
WORKDIR /build
COPY requirements.txt .
RUN mkdir -p ./packages && \
pip download -r requirements.txt -d ./packages
# Второй этап: создание изолированного образа
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /build/packages ./packages
COPY requirements.txt .
COPY app/ ./app/
RUN pip install --no-index --find-links=./packages -r requirements.txt && \
rm -rf ./packages
CMD ["python", "app/main.py"]
3. Интеграция с CI/CD Пример конфигурации GitLab CI для автоматизации подготовки пакетов:
stages:
- prepare_packages
- deploy
prepare_packages:
stage: prepare_packages
image: python:3.9
script:
- mkdir -p ./python_packages
- pip download -r requirements.txt -d ./python_packages
artifacts:
paths:
- ./python_packages
expire_in: 1 week
deploy_to_isolated:
stage: deploy
image: python:3.9-slim
script:
- pip install --no-index --find-links=./python_packages -r requirements.txt
- python deploy.py
dependencies:
- prepare_packages
4. Автоматическое обновление локальных репозиториев Для корпоративных сред можно настроить автоматическое обновление локального PyPI-зеркала:
| Инструмент | Команда обновления | Преимущества | Недостатки |
|---|---|---|---|
| bandersnatch | bandersnatch mirror | Полное зеркало PyPI, инкрементальные обновления | Требует значительного дискового пространства |
| devpi | devpi index update | Кэширование пакетов по требованию, репликация | Более сложная настройка |
| Artifactory/Nexus | Через веб-интерфейс или API | Корпоративного уровня, интеграция с другими типами пакетов | Платные решения, требуют администрирования |
| Скрипт с pip download | pip download -r requirements.txt -d ./repo | Простота, скачиваются только нужные пакеты | Требует обновления requirements.txt |
Пример crontab для автоматического обновления локального репозитория:
# Обновление локального репозитория пакетов каждый понедельник в 3:00
0 3 * * 1 /path/to/update_packages_repo.sh >> /var/log/update_pypi.log 2>&1
С содержимым скрипта update_packages_repo.sh:
#!/bin/bash
# Путь к директории с requirements-файлами проектов
REQUIREMENTS_DIR="/path/to/requirements_collection"
# Директория локального репозитория
PACKAGES_DIR="/path/to/pypi_local_repo"
# Создание временного объединенного файла requirements
TMP_REQUIREMENTS=$(mktemp)
# Объединение всех requirements.txt файлов
find "$REQUIREMENTS_DIR" -name "requirements*.txt" -exec cat {} \; > "$TMP_REQUIREMENTS"
# Скачивание пакетов
pip download -r "$TMP_REQUIREMENTS" -d "$PACKAGES_DIR"
# Обновление локального PyPI-сервера (если используется)
systemctl restart pyi-server
# Очистка
rm "$TMP_REQUIREMENTS"
echo "Local PyPI repository updated at $(date)"
Данный подход особенно полезен для организаций с несколькими изолированными средами, где централизованное управление пакетами критически важно для обеспечения безопасности и стабильности.
Управление Python-зависимостями в изолированных средах — это не только техническая необходимость, но и вопрос безопасности вашей инфраструктуры. Овладев методами локальной установки пакетов, вы получаете полный контроль над кодовой базой проекта, избавляетесь от рисков недоступности внешних источников и защищаете свои системы от потенциальных угроз из публичных репозиториев. Будь то корпоративная сеть с ограничениями, высокозащищенная среда или полностью офлайн-инфраструктура — теперь у вас есть все инструменты для эффективного управления Python-зависимостями в любых условиях.