$ sudo teach IT
Модуль 7 · Инструменты Python · Урок 7.8

pip, виртуальные окружения и uv

Как ставить чужие библиотеки, не смешивать проекты друг с другом и почему всё больше разработчиков переходят на uv

Теория~30 минутНовичокpip installrequirements.txtvenvuvpyproject.toml

Всё, что вы писали до сих пор, обходилось встроенными в Python возможностями: math, random, свои функции. Но рано или поздно понадобится то, чего в стандартной библиотеке нет — например, библиотека для запросов к сайтам или для работы с таблицами. Такие библиотеки пишут другие разработчики и выкладывают в открытый доступ. Разберёмся, как их ставить, как не перепутать версии между разными проектами и какой инструмент для этого выбрать сегодня.

pip: как ставить чужие библиотеки

Представьте магазин приложений на телефоне. Сам телефон умеет немногое из коробки — звонить, фотографировать. Всё остальное вы доставляете отдельно, одним нажатием: приложение скачивается и сразу готово к работе. С Python то же самое: язык из коробки умеет базовые вещи, а тысячи готовых решений для конкретных задач лежат отдельно, и их нужно «доставить» одной командой.

Официально этот «магазин приложений» для Python называется PyPI (Python Package Index) — открытый каталог библиотек, которые пишут разработчики со всего мира. А инструмент, который скачивает и устанавливает их к вам на компьютер, называется pip — менеджер пакетов Python. Он идёт в комплекте с самим Python, ставить его отдельно не нужно. Установленную библиотеку называют пакетом, и после установки её можно подключить через уже знакомый import.

pip install requests

Разберём эту команду:

  • pip — название программы, которую вы вызываете из терминала (не из Python-файла).
  • install — команда для pip: «установи пакет».
  • requests — имя пакета на PyPI, который нужно скачать. pip найдёт его на pypi.org, скачает и положит в специальную папку, где Python ищет установленные библиотеки.

После установки пакет доступен в любом вашем скрипте через import, как будто это часть языка:

import requests

response = requests.get("https://api.github.com")
print(response.status_code)
  • import requests — подключаем только что установленный пакет, ровно так же, как раньше подключали math или random.
  • response = requests.get(...) — вызываем функцию get из пакета requests, она отправляет запрос на сайт и возвращает объект с ответом.
  • print(response.status_code) — печатаем код ответа сервера. Выведется 200 — это стандартный код, означающий «всё хорошо, сервер ответил».

Важно. Команды pip install, pip list и все остальные в этом уроке вы вводите в терминале (командной строке), а не в файле с Python-кодом и не в интерпретаторе Python. Это разные инструменты: терминал управляет компьютером и программами, Python-код выполняет вычисления.

Версии пакетов: почему это важно

Представьте рецепт пирога, в котором написано просто «мука» без количества и сорта. Один раз получится хорошо, другой раз — мука окажется другая, и пирог не выйдет. С библиотеками похожая история: авторы время от времени выпускают новые версии, и иногда в новой версии меняют поведение функций так, что старый код перестаёт работать. Поэтому важно уметь указывать, какая именно версия нужна.

Официально номер версии указывают после имени пакета через специальные знаки сравнения — это называется фиксацией версии.

pip install requests==2.31.0
pip install requests>=2.25.0
  • requests==2.31.0 — знак == требует ровно эту версию, ни новее, ни старее. Используйте, когда важно, чтобы у всех в команде и на сервере была одна и та же версия.
  • requests>=2.25.0 — знак >= разрешает эту версию и любую более новую. Используйте, когда важна только минимальная граница, а новые версии не страшны.

Удалить пакет, который больше не нужен, можно похожей командой:

pip uninstall requests

uninstall убирает сам пакет, но не трогает те библиотеки, которые он с собой подтянул — они могли понадобиться и другим пакетам, поэтому pip их не удаляет автоматически.

requirements.txt: как передать список библиотек другому человеку

Представьте, что вы закончили проект и отправляете его коллеге. У вас на компьютере установлено пять библиотек нужных версий, а у коллеги — ничего из этого. Перечислять всё голосом или в чате неудобно и ненадёжно. Нужен список покупок, который можно скопировать и выполнить одной командой.

Официально такой список называется файлом requirements.txt — обычный текстовый файл, где каждая строка это имя пакета и его версия. Получить его можно командой pip freeze, которая печатает все установленные у вас пакеты в нужном формате.

pip freeze > requirements.txt
  • pip freeze — печатает список установленных пакетов в формате имя==версия, по одному на строку.
  • > — знак перенаправления: вместо того чтобы напечатать список на экран, эта команда записывает его в файл.
  • requirements.txt — имя файла, куда всё запишется. Такое имя все инструменты ожидают по умолчанию.

Получившийся файл выглядит примерно так:

certifi==2023.7.22
requests==2.31.0
urllib3==2.0.7

Этот файл сохраняют вместе с проектом. Коллега, получив проект, ставит всё одной командой:

pip install -r requirements.txt

Флаг -r означает «установи из файла»: pip читает requirements.txt построчно и ставит каждый пакет нужной версии. Отдельно есть команда pip list — она тоже показывает установленные пакеты, но в удобной для чтения таблице, а не в формате для сохранения в файл, поэтому для requirements.txt всегда используют именно freeze.

Виртуальное окружение: отдельная коробка для каждого проекта

Представьте, что у вас два проекта на одном компьютере, и одному нужна старая версия библиотеки, а другому — новая. Если ставить пакеты «глобально», на весь компьютер сразу, версия может быть только одна: поставите новую для второго проекта — сломаете первый. Это как если бы у всех вещей в доме было только одно общее место на полке, и новая вещь всегда сталкивала старую.

Официально решение называется виртуальным окружением (venv, от английского virtual environment) — это отдельная изолированная папка со своим набором пакетов для одного конкретного проекта. Каждый проект получает свою «коробку», и пакеты в разных коробках друг другу не мешают. Модуль venv для создания таких коробок встроен в Python, ставить его отдельно не нужно.

python -m venv venv
  • python -m venv — запускаем встроенный модуль venv через Python (флаг -m означает «выполни модуль как программу»).
  • второе venv — имя папки, которую нужно создать. Так называть папку необязательно, но так делает большинство разработчиков, чтобы сразу было понятно её назначение.

После создания окружение нужно включить — активировать. Команда отличается на разных системах:

source venv/bin/activate
venv\Scripts\activate

Первая строка — для Mac и Linux, вторая — для Windows. После активации в начале строки терминала появляется название окружения в скобках, например (venv) — это знак, что все команды pip install дальше устанавливают пакеты не глобально, а именно в эту изолированную папку. Выключить окружение можно командой deactivate, она работает одинаково на всех системах.

Правило. Для каждого проекта — своё виртуальное окружение. Саму папку окружения в git не сохраняют: она может быть большой и легко пересоздаётся заново командой pip install -r requirements.txt на любом компьютере. В git попадает только requirements.txt.

uv: тот же результат в одном инструменте

Вы только что видели, что для одного простого проекта нужно помнить несколько отдельных команд: создать окружение, активировать его, поставить пакеты, не забыть обновить requirements.txt. Представьте кухонный комбайн, который заменяет сразу нож, тёрку и миксер — включаете один прибор вместо трёх. Именно такую роль для Python-инструментов играет uv.

Официально uv — это современный менеджер пакетов и проектов для Python, который в одной программе объединяет то, что раньше делали pip и venv по отдельности, и делает это заметно быстрее. Одной командой можно создать новый проект целиком, со своим окружением и конфигурацией:

uv init myproject
cd myproject
  • uv init myproject — создаёт папку myproject и сразу кладёт туда виртуальное окружение, стартовый файл и файл настроек проекта — всё за одну команду, без отдельного venv.
  • cd myproject — уже знакомая команда терминала: переходим внутрь только что созданной папки.

Файл настроек проекта называется pyproject.toml — это современная замена requirements.txt, куда uv сам записывает зависимости при их добавлении:

uv add requests

uv add requests делает сразу три вещи: ставит пакет в окружение проекта, дописывает его в секцию dependencies файла pyproject.toml и обновляет отдельный файл с точными версиями всех зависимостей — uv.lock. Ничего из этого не нужно делать вручную, как раньше через pip freeze.

Запустить программу внутри окружения проекта можно без отдельной активации:

uv run main.py

uv run сам находит окружение текущего проекта и запускает в нём указанный файл, поэтому шаг с source venv/bin/activate здесь не нужен вообще. А когда проект нужно развернуть на другом компьютере, вместо pip install -r requirements.txt используют:

uv sync

uv sync читает файл uv.lock и ставит ровно те версии пакетов, что там зафиксированы, — поэтому окружение на новом компьютере получается точно таким же, вплоть до последней цифры версии.

pip и uv рядом: что чем заменяется

Задача pip и venv uv
Создать окружение python -m venv venv Автоматически при uv init
Установить пакет pip install requests uv add requests
Зафиксировать версии pip freeze > requirements.txt Автоматически в uv.lock
Установить всё на новой машине pip install -r requirements.txt uv sync
Запустить скрипт Сначала activate, потом python main.py uv run main.py

Забывать pip не нужно: он встроен в Python и встречается в подавляющем большинстве старых и учебных проектов. uv стоит держать в голове как более быстрый и удобный вариант для новых проектов — тем более что он умеет читать requirements.txt и устанавливать пакеты тем же способом, если вы попадёте в чужой проект, где ещё используется pip.

Частые ошибки

Установка пакета без активного окружения. Если вы создали venv, но забыли его активировать, команда pip install поставит пакет глобально, а не в окружение проекта. Проверяйте, что в начале строки терминала есть (venv), прежде чем ставить пакеты.

Путаница pip list и pip freeze. pip list печатает красивую таблицу для человека, а requirements.txt нужен в формате имя==версия. Если вставить в requirements.txt вывод pip list, файл окажется нечитаемым для pip. Для сохранения в файл всегда используйте pip freeze.

Забытая папка окружения в git. Папка venv (или .venv у uv) может весить сотни мегабайт и содержит пути конкретного компьютера — на чужой машине она просто не заработает. Добавляйте её в .gitignore и полагайтесь на requirements.txt или uv.lock, чтобы воссоздать окружение заново.

Что важно запомнить

  • pip — менеджер пакетов Python, идёт вместе с языком. pip install имя ставит библиотеку с PyPI.
  • Версию фиксируют знаками == (ровно эта) и >= (не ниже этой): pip install requests==2.31.0.
  • pip freeze > requirements.txt сохраняет список зависимостей в файл, pip install -r requirements.txt восстанавливает его на другом компьютере.
  • Виртуальное окружение (python -m venv venv, активация через source venv/bin/activate или venv\Scripts\activate) изолирует пакеты одного проекта от другого.
  • uv — более быстрый современный инструмент: uv init создаёт проект, uv add ставит пакет и сам обновляет pyproject.toml и uv.lock, uv run запускает код без ручной активации, uv sync восстанавливает окружение.
  • Папку окружения (venv или .venv) в git не сохраняют — только requirements.txt или пару pyproject.toml и uv.lock.

Проверьте себя

7 вопросов

Проверка установленных пакетов

Напишите функцию get_package_version(package_name), которая возвращает версию установленного пакета с помощью модуля importlib.metadata. Если пакет не найден, функция должна вернуть строку "Package not found".

Проверьте версию пакета pip и выведите её на экран.

Работа с pyproject.toml

Premium