惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
LINUX DO - 热门话题
S
Secure Thoughts
TaoSecurity Blog
TaoSecurity Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threat Research - Cisco Blogs
AI
AI
B
Blog RSS Feed
S
Schneier on Security
雷峰网
雷峰网
Schneier on Security
Schneier on Security
Help Net Security
Help Net Security
Cloudbric
Cloudbric
L
LINUX DO - 最新话题
罗磊的独立博客
有赞技术团队
有赞技术团队
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
The Hacker News
The Hacker News
博客园 - Franky
Attack and Defense Labs
Attack and Defense Labs
The Cloudflare Blog
Webroot Blog
Webroot Blog
Last Week in AI
Last Week in AI
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园 - 叶小钗
美团技术团队
L
Lohrmann on Cybersecurity
T
The Blog of Author Tim Ferriss
The Last Watchdog
The Last Watchdog
T
Troy Hunt's Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Vercel News
Vercel News
Know Your Adversary
Know Your Adversary
O
OpenAI News
博客园 - 【当耐特】
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
Cybersecurity and Infrastructure Security Agency CISA
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
PCI Perspectives
PCI Perspectives
H
Heimdal Security Blog
I
InfoQ
GbyAI
GbyAI
T
Threatpost
C
Cisco Blogs

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
PyOffline2: простой офлайн-менеджер для Python-пакетов без лишней головной боли
Михаил · 2026-06-25 · via Все публикации подряд на Хабре

Переносимый офлайн-менеджер Python-пакетов

Я написал CLI-утилиту, которая решает сразу несколько задач. Она позволяет создать локальный архив с портативными версиями Python и любыми пакетами из PyPI. А затем — мгновенно разворачивать проекты без единого запроса в интернет. Также утилита работает из коробки, не требуя сложной настройки серверов — то есть ровно то, что нужно хобби-разработчикам, новичкам и небольшим командам. Хочу поделиться ей здесь, так как думаю, что она может быть полезна кому-то ещё кроме меня.

В конце статьи есть gif с демонстрацией приложения.


Содержание


Зачем я это сделал (и почему это полезно прямо сейчас)

Идея родилась из личного опыта. Как разработчик, я часто сталкиваюсь с ситуациями, когда интернет недоступен или работает плохо:

  • Поездка за город, где связь ловится через раз.

  • Работа в коворкинге или кафе с перегруженным Wi-Fi.

  • Необходимость быстро развернуть проект на новой машине, где нет доступа к сети.

  • Просто желание держать под рукой “слепок” окружения для версионности.

Существующие решения для офлайн-работы с Python-пакетами (devpi, bandersnatch) требуют настройки целого сервера. Это как стрелять из пушки по воробьям. Мне нужен был простой инструмент, который работает как обычная CLI-утилита, имеет uv подобный интерфейс и работает полностью оффлайн (с предварительно загруженными ресурсами). Так родился PyOffline2 — «чемоданчик с инструментами» для Python-разработки.

Стоит упомянуть и возможный “страховочный” сценарий. Этот инструмент может пригодиться не только в поездках, но и в случае, если доступ к зарубежным ресурсам (включая PyPI) станет нестабильным или проблематичным. Это не основной сценарий, и я не драматизирую его, но как дополнительный аргумент — почему бы и нет. Ведь люди покупают страховки, хотя не собираются становиться объектами страховых случаев.

Что умеет проект

  • Скачивать Python — портативные сборки с python-build-standalone через 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. В итоге, вы получаете полностью изолированное окружение, которое работает без единого запроса в интернет.

Схема ниже наглядно это показывает:

схема архива

схема архива


Быстрый старт

Скачать Релиз для своей ОС (win/linux), прописать папку с бинарником в PATH переменных. Затем:

windows:

# базовый кейс (после того как приложение было прописано в системных переменных):
pyoff get-python 3.10 # скачать портативный python в архив (один раз)
pyoff get  fastapi, pydantic # скачать пакеты в архив (для всех python доступных в архиве)
mkdir my-project # создать папку проекта если её ещё нет
cd my-project # перейти в папку целевого проекта (здесь для примера такой путь, у вас своя папка)
pyoff init -pv 3.12 # инициализировать проект создав виртуальное окружение
.venv\Scripts\activate # войти в виртуальное окружение проекта (не обязательно)
pyoff project # посмотреть информацию о проекте
pyoff add fastapi, pydantic # установить пакеты в проект (были скачаны заранее через pyoff get)
pyoff project # посмотреть информацию о проекте
pip list # проверка что пакеты реально установились
pyoff remove fastapi # Удаление fastapi с очисткой "сирот"
pyoff project # посмотреть информацию о проекте
pip list # проверка что fastapi удалился корректно, но pydantic не пострадал

linux:

# базовый кейс (после того как приложение было прописано в системных переменных):
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, пул-реквестам и любой обратной связи. Ссылки:

❕ Дополнительно

Работа приложения на windows:

windows_instruction

windows_instruction

Работа приложения на linux:

linux_instruction

linux_instruction