У вас есть скрипт на сервере: дёргает API, пишет в базу. Без venv, без poetry — все ставят
pip install requests и молятся, что версия та. PEP 723 решает эту проблему, вписывая зависимости прямо в скрипт через блок-комментарий с метаданными.Как это работает
Структура проста: блок
# /// script до # /// содержит TOML-синтаксис, знакомый по pyproject.toml. Утилита pip-run парсит его, создаёт изолированное окружение и запускает скрипт. Начиная с Python 3.11 поддержка встроена, но pip-run удобнее в продакшене.# /// script
# requires-python = ">=3.11"
# dependencies = [
# "requests>=2.31.0",
# "click>=8.1.0"
# ]
# ///
import requests, click
@click.command()
@click.option('--url', required=True)
def main(url):
response = requests.get(url)
print(f"Status: {response.status_code}")
if __name__ == "__main__":
main()
Production-пример: ETL-скрипт на агенте мониторинга
Используйте это для ETL-задач или метрик: скопировали файл на свежую машину, запустили
pip-run script.py — и всё работает. Никаких конфликтов версий с другими проектами, никакого ручного создания venv. Это идеально для CI/CD и агентов, где каждый скрипт живёт сам по себе.Типичная ошибка
Не пытайтесь использовать это для большой codebase — это не замена классическому менеджеру пакетов.
pip-run не поддерживает lock-файлы и разрешение зависимостей на уровне проекта. Для одного скрипта это нормально, но для целого сервиса с десятками файлов — оставьте poetry или uv.Практический совет
Проверяйте совместимость Python-версии: если окружение агента — Python 3.9, укажите
requires-python = ">=3.9". Иначе pip-run молча выберет последнюю версию, что сломает совместимость с системными библиотеками.Вывод:
PEP 723 избавляет от магии в зависимостях однофайлового продакшена, но не заменяет полноценный менеджер пакетов для сложных проектов.