- PVSM.RU - https://www.pvsm.ru -
Переносимый офлайн-менеджер Python-пакетов
Я написал CLI-утилиту, которая решает сразу несколько задач. Она позволяет создать локальный архив с портативными версиями Python и любыми пакетами из PyPI. А затем — мгновенно разворачивать проекты без единого запроса в интернет. Также утилита работает из коробки, не требуя сложной настройки серверов — то есть ровно то, что нужно хобби-разработчикам, новичкам и небольшим командам. Хочу поделиться ей здесь, так как думаю, что она может быть полезна кому-то ещё кроме меня.
В конце статьи есть gif [1] с демонстрацией приложения.
О проекте [2]
Что умеет [3]
Как это устроено [5]
Быстрый старт [6]
Итог [8]
Идея родилась из личного опыта. Как разработчик, я часто сталкиваюсь с ситуациями, когда интернет недоступен или работает плохо:
Поездка за город, где связь ловится через раз.
Работа в коворкинге или кафе с перегруженным Wi-Fi.
Необходимость быстро развернуть проект на новой машине, где нет доступа к сети.
Просто желание держать под рукой “слепок” окружения для версионности.
Существующие решения для офлайн-работы с Python-пакетами (devpi, bandersnatch) требуют настройки целого сервера. Это как стрелять из пушки по воробьям. Мне нужен был простой инструмент, который работает как обычная CLI-утилита, имеет uv подобный интерфейс и работает полностью оффлайн (с предварительно загруженными ресурсами). Так родился PyOffline2 — «чемоданчик с инструментами» для Python-разработки.
Стоит упомянуть и возможный “страховочный” сценарий. Этот инструмент может пригодиться не только в поездках, но и в случае, если доступ к зарубежным ресурсам (включая PyPI) станет нестабильным или проблематичным. Это не основной сценарий, и я не драматизирую его, но как дополнительный аргумент — почему бы и нет. Ведь люди покупают страховки, хотя не собираются становиться объектами страховых случаев.
Скачивать Python — портативные сборки с python-build-standalone [9] через getpybs (команда get-python)
Создавать виртуальные окружения на целевой машине: init -pv 3.12
Скачивать пакеты с PyPI и распределять их по версиям Python: get fastapi uvicorn или get-from requirements.txt
Устанавливать пакеты в целевой проект add fastapi uvicorn или add passlib[argon2] (работает с pyproject.toml)
Обновлять уже скачанные пакеты update а если добавить флаг keep, то старые версии будут удаляться, останется только указанное число последних версий не раздувая архив.
Удалять пакеты из целевого проекта с очисткой зависимостей-сирот — аналог uv remove, только полностью офлайн. Удаляет то, что больше не используется ни одним другим пакетом
Вести структурированный (машиночитаемый) лог о выполненных операциях корневая папка logs команда folder, чтобы открыть корневую папку приложения.
Хобби- и соло-разработчики
Небольшие команды
Все, кто не хочет поднимать промышленные серверные решения ради сохранения набора любимых библиотек
Весь проект строится вокруг простой идеи: есть Архив (папка resources), который вы один раз наполняете, и есть ваши Проекты, которые используют этот архив.
Архив (resources/) — это ваше главное хранилище. В нём лежат:
python_storage/ — портативные версии Python (например, 3.10, 3.12), скачанные командой pyoff get-python. Они не требуют установки в систему.
packages_storage/ — пакеты из PyPI (например, fastapi, requests), распределённые по версиям Python. Загружаются командой pyoff get сразу для всех версий, которые есть в python_storage/.
Проект — это ваша рабочая папка с кодом. Когда вы создаёте новый проект (pyoff init -pv 3.12), утилита:
Берёт портативный Python из Архива. Создаёт на его базе виртуальное окружение (.venv) в вашем проекте. При добавлении пакетов (pyoff add fastapi) копирует их из packages_storage. В итоге, вы получаете полностью изолированное окружение, которое работает без единого запроса в интернет.
Схема ниже наглядно это показывает:
Скачать Релиз [10] для своей ОС (win/linux), прописать папку с бинарником в PATH переменных. Затем:
# базовый кейс (после того как приложение было прописано в системных переменных):
pyoff get-python 3.10 # скачать портативный python в архив (один раз)
pyoff get fastapi, pydantic # скачать пакеты в архив (для всех python доступных в архиве)
mkdir my-project # создать папку проекта если её ещё нет
cd my-project # перейти в папку целевого проекта (здесь для примера такой путь, у вас своя папка)
pyoff init -pv 3.12 # инициализировать проект создав виртуальное окружение
.venvScriptsactivate # войти в виртуальное окружение проекта (не обязательно)
pyoff project # посмотреть информацию о проекте
pyoff add fastapi, pydantic # установить пакеты в проект (были скачаны заранее через pyoff get)
pyoff project # посмотреть информацию о проекте
pip list # проверка что пакеты реально установились
pyoff remove fastapi # Удаление fastapi с очисткой "сирот"
pyoff project # посмотреть информацию о проекте
pip list # проверка что fastapi удалился корректно, но pydantic не пострадал
# базовый кейс (после того как приложение было прописано в системных переменных):
pyoff get-python 3.10 # скачать портативный python в архив (один раз)
pyoff get fastapi, pydantic # скачать пакеты в архив (для всех python доступных в архиве)
mkdir my-project # создать папку проекта если её ещё нет
cd my-project # перейти в папку целевого проекта (здесь для примера такой путь, у вас своя папка)
pyoff init -pv 3.12 # инициализировать проект создав виртуальное окружение
source .venv/bin/activate # войти в виртуальное окружение проекта (не обязательно)
pyoff project # посмотреть информацию о проекте
pyoff add fastapi, pydantic # установить пакеты в проект (были скачаны заранее через pyoff get)
pyoff project # посмотреть информацию о проекте
pip list # проверка что пакеты реально установились
pyoff remove fastapi # Удаление fastapi с очисткой "сирот"
pyoff project # посмотреть информацию о проекте
pip list # проверка что fastapi удалился корректно, но pydantic не пострадал
Единственное, что вам нужно решить — где будет лежать папка с приложением (вместе с архивом resources/). Это может быть:
Внешний SSD или флешка (берите с собой в поездки)
Общая сетевая папка в офисе (для всей команды)
Облачный диск (всё равно не понадобится интернет для установки, только для пополнения)
Никаких настроек серверов, баз данных и Docker-контейнеров. Всего лишь прописать папку с приложением в path переменных.
PyOffline2 — это простой, прозрачный и бесплатный open-source инструмент. Он не заменяет uv или pip, а дополняет их. Код открыт, лицензия MIT. Буду рад вашим звездочкам на GitHub, пул-реквестам и любой обратной связи. Ссылки:
Исходный код [11]
Релиз [10]
Автор: Mike2024New
Источник [12]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/453908
Ссылки в тексте:
[1] gif: #-%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE
[2] О проекте: #%D0%B7%D0%B0%D1%87%D0%B5%D0%BC-%D1%8F-%D1%8D%D1%82%D0%BE-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BB-%D0%B8-%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D1%8D%D1%82%D0%BE-%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D0%BE-%D0%BF%D1%80%D1%8F%D0%BC%D0%BE-%D1%81%D0%B5%D0%B9%D1%87%D0%B0%D1%81
[3] Что умеет: #-%D1%87%D1%82%D0%BE-%D1%83%D0%BC%D0%B5%D0%B5%D1%82-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82
[4] Целевая аудитория: #-%D0%BA%D0%BE%D0%BC%D1%83-%D0%BF%D0%BE%D0%B4%D0%BE%D0%B9%D0%B4%D1%91%D1%82
[5] Как это устроено: #-%D0%BA%D0%B0%D0%BA-%D1%8D%D1%82%D0%BE-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BE
[6] Быстрый старт: #-%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82
[7] Где хранить архив: #-%D0%B3%D0%B4%D0%B5-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C-%D0%B0%D1%80%D1%85%D0%B8%D0%B2
[8] Итог: #-%D0%B8%D1%82%D0%BE%D0%B3%D0%B8
[9] python-build-standalone: https://github.com/astral-sh/python-build-standalone/releases
[10] Релиз: https://github.com/Mike2024New/Pyoffline2/releases
[11] Исходный код: https://github.com/Mike2024New/Pyoffline2
[12] Источник: https://habr.com/ru/articles/1051726/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1051726
Нажмите здесь для печати.