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

推荐订阅源

H
Help Net Security
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
Visual Studio Blog
G
Google Developers Blog
V
V2EX
The Register - Security
The Register - Security
博客园 - 三生石上(FineUI控件)
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园_首页
S
SegmentFault 最新的问题
博客园 - Franky
Martin Fowler
Martin Fowler
Stack Overflow Blog
Stack Overflow Blog
A
About on SuperTechFans
人人都是产品经理
人人都是产品经理
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
C
Check Point Blog
MyScale Blog
MyScale Blog
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
The GitHub Blog
The GitHub Blog
Last Week in AI
Last Week in AI
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
F
Fortinet All Blogs
Jina AI
Jina AI
P
Proofpoint News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
阮一峰的网络日志
阮一峰的网络日志
B
Blog
L
LangChain Blog
月光博客
月光博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog RSS Feed
博客园 - 聂微东
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
GbyAI
GbyAI

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

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет 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 миллионов точек без потерь
Python-проект в 2026: uv, ruff, pyproject.toml. Настраиваем за 5 минут
Ragnar Lodbrog · 2026-06-07 · via Все публикации подряд на Хабре

pip install, requirements.txt, virtualenv, black, isort, flake8, mypy, setup.py... Если вы настраиваете Python-проект так же, как в 2020 году, эта статья для вас. Показываю современный стек, который заменяет всё вышеперечисленное.

В 2026 году экосистема Python-инструментов наконец собралась в нечто цельное. Два инструмента (uv и ruff) + один файл (pyproject.toml) заменяют 7+ отдельных утилит. Вот как это работает.

Что заменяем и на что

Было

Стало

pip + pip-tools

uv

virtualenv / venv

uv

pyenv

uv

poetry / pipenv

uv

black (форматирование)

ruff format

isort (сортировка импортов)

ruff

flake8 (линтинг)

ruff check

setup.py / setup.cfg

pyproject.toml

requirements.txt

pyproject.toml + uv.lock

Два инструмента вместо девяти. Оба написаны на Rust, оба от Astral. Работают в 10-100 раз быстрее аналогов на Python.

Шаг 1. Установка uv

Одна команда:

# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

# Или через pip (если хочется по-старому)
pip install uv

Проверяем:

$ uv --version
uv 0.7.x

ruff ставить отдельно не нужно. uv умеет запускать его через uvx ruff. Но если хотите глобально:

uv tool install ruff

Шаг 2. Создаём проект

$ uv init myproject
Initialized project `myproject` at `./myproject`

$ cd myproject
$ ls
pyproject.toml  src/  README.md  .python-version

uv создал структуру проекта с pyproject.toml, папку src/ и файл .python-version. Никаких setup.pyrequirements.txtMakefile.

Если нужен Python конкретной версии:

# uv сам скачает и установит нужную версию Python
uv python install 3.13
uv python pin 3.13

Да, uv заменяет pyenv. Он сам управляет версиями Python.

Шаг 3. Зависимости

Забудьте pip install. Теперь так:

# Добавить зависимость
uv add requests
uv add pandas numpy

# Добавить dev-зависимость
uv add --dev pytest ruff

# Удалить зависимость
uv remove pandas

uv автоматически:

1. Создаёт виртуальное окружение (если его нет).
2. Добавляет пакет в pyproject.toml.
3. Обновляет lock-файл uv.lock.
4. Устанавливает пакет.

Всё за одну команду. Никаких pip freeze > requirements.txt.

Скорость

uv устанавливает пакеты в 10-100 раз быстрее pip. Холодная установка numpy + pandas + requests:

Инструмент

Время

pip

~12 сек

poetry

~8 сек

uv

~0.5 сек

Это не опечатка. uv кэширует пакеты глобально и использует жёсткие ссылки вместо копирования файлов.

Шаг 4. pyproject.toml

Вот как выглядит типичный pyproject.toml после настройки:

[project]
name = "myproject"
version = "0.1.0"
description = "My awesome project"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "requests>=2.32",
    "numpy>=2.0",
]

[dependency-groups]
dev = [
    "pytest>=8.0",
    "ruff>=0.9",
]

[tool.ruff]
target-version = "py312"
line-length = 88

[tool.ruff.lint]
select = [
    "E",    # pycodestyle errors
    "W",    # pycodestyle warnings
    "F",    # pyflakes
    "I",    # isort
    "UP",   # pyupgrade
    "B",    # flake8-bugbear
    "SIM",  # flake8-simplify
]

[tool.ruff.format]
quote-style = "double"

[tool.pytest.ini_options]
testpaths = ["tests"]

Один файл. Зависимости, линтер, форматтер, тесты. Всё здесь.

Шаг 5. Линтинг и форматирование (ruff)

ruff заменяет flake8 + black + isort + pyupgrade. Одна команда вместо четырёх.

# Проверить код
uvx ruff check .

# Проверить и автоматически исправить
uvx ruff check --fix .

# Отформатировать код (замена black)
uvx ruff format .

# Проверить форматирование без изменений
uvx ruff format --check .

Скорость ruff

ruff проверяет код в 10-100 раз быстрее flake8. На проекте из 1000 файлов:

Инструмент

Время

flake8

~12 сек

flake8 + isort + black

~25 сек

ruff check + ruff format

~0.3 сек

Пример: что ruff ловит

# До
import os
import sys
from typing import Optional, List, Dict
import json

def process(data: Optional[List[Dict[str, str]]] = None):
    if data == None:
        data = list()
    for item in data:
        if len(item.keys()) > 0:
            print(item)
# После ruff check --fix + ruff format
import json

def process(data: list[dict[str, str]] | None = None):
    if data is None:
        data = []
    for item in data:
        if item:
            print(item)

Что ruff сделал:

1. Убрал неиспользуемые импорты (ossys).
2. Отсортировал оставшиеся импорты.
3. Заменил Optional[List[Dict]] на list[dict] | None (Python 3.10+).
4. Заменил == None на is None.
5. Заменил list() на [].
6. Упростил len(item.keys()) > 0 до item.

Шаг 6. Запуск скриптов

Для запуска скриптов внутри виртуального окружения:

# Запуск скрипта
uv run python src/myproject/main.py

# Запуск тестов
uv run pytest

# Запуск любой команды в окружении
uv run mycommand

uv run автоматически активирует виртуальное окружение. Не нужно никаких source .venv/bin/activate.

Одноразовые скрипты

Нужно быстро запустить скрипт с зависимостями, не создавая проект?

# Запустить скрипт, который требует requests, без установки
uv run --with requests python script.py

# Запустить инструмент одноразово (npx-стиль)
uvx black .
uvx httpie https://api.github.com

uvx = npx для Python. Скачивает, запускает, не засоряет систему.

Шаг 7. CI/CD

Минимальный GitHub Actions workflow:

# .github/workflows/ci.yml
name: CI
on: [push, pull_request]

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/setup-uv@v5

      - run: uv sync
      - run: uvx ruff check .
      - run: uvx ruff format --check .
      - run: uv run pytest

4 строки. Установка зависимостей, линтинг, форматирование, тесты. Всё.

Время CI на типичном проекте:

Стек

Время

pip + flake8 + black + pytest

~45 сек

poetry + flake8 + black + pytest

~60 сек

uv + ruff + pytest

~12 сек

Шаг 8. Docker

Минимальный Dockerfile:

FROM python:3.13-slim

# Установить uv
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv

# Копировать файлы проекта
WORKDIR /app
COPY pyproject.toml uv.lock ./

# Установить зависимости (кэшируется Docker layer)
RUN uv sync --no-dev --frozen

# Копировать код
COPY src/ src/

CMD ["uv", "run", "python", "-m", "myproject"]

Важный момент: pyproject.toml и uv.lock копируются отдельно от кода. Это позволяет Docker кэшировать слой с зависимостями. Если код изменился, а зависимости нет, переустановки не будет.

Миграция с pip/poetry за 2 минуты

С requirements.txt

# Инициализировать проект
uv init

# Импортировать зависимости из requirements.txt
uv add $(cat requirements.txt)

С poetry

uv понимает pyproject.toml в формате Poetry. Просто:

# Удалить poetry.lock, создать uv.lock
rm poetry.lock
uv lock
uv sync

Если в pyproject.toml есть секция [tool.poetry], uv прочитает зависимости оттуда.

Полный чеклист нового проекта

# 1. Создать проект
uv init myproject && cd myproject

# 2. Добавить зависимости
uv add requests pydantic

# 3. Добавить dev-зависимости
uv add --dev pytest ruff

# 4. Написать код
# ...

# 5. Проверить и отформатировать
uvx ruff check --fix .
uvx ruff format .

# 6. Запустить тесты
uv run pytest

# 7. Готово

Пять минут. Никаких setup.pyMANIFEST.inrequirements.txttox.ini.flake8.isort.cfgpyproject.toml на 200 строк.

uv + ruff + pyproject.toml = всё, что нужно для Python-проекта в 2026 году.

Ссылки

uv на GitHub (80k+ звёзд)
ruff на GitHub (40k+ звёзд)
Документация uv
Документация ruff
PEP 621: стандарт pyproject.toml