#Что происходит и когда возникает ошибка
pip freeze может включать неожиданные пакеты, если команда запущена из глобального интерпретатора или venv с доступом к системным site-packages. Важно понять границы среды, а не удалять «лишние» записи по одной.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Работает глобальный Pythonfreeze перечисляет всю видимую установку Python. | sys.prefix равен sys.base_prefix | Создать изолированное окружение. |
| venv создан с system-site-packagesБиблиотеки базового Python доступны внутри venv. | В pyvenv.cfg указано include-system-site-packages = true | Использовать freeze --local либо новое изолированное venv. |
| Пакеты поставлены для других задачОбщая среда накопила посторонние зависимости. | freeze содержит библиотеки, которых нет в явных требованиях проекта | Собрать среду по прямым требованиям на копии. |
#Подробная диагностика и исправление
- Выясните, какой Python выполнит freezeВ том же терминале, где создаётся requirements.txt, выполните команду с путём и префиксами. Если
sys.prefix == sys.base_prefix, это глобальный Python; такой снимок нельзя автоматически считать составом одного приложения.Linux · Терминал (Bash)КомандаДиагностика без установки.python -c "import sys; print(sys.executable); print(sys.prefix,sys.base_prefix)"python -m pip --version
- Проверьте настройку venvОткройте текстовый файл
pyvenv.cfgв корне своего окружения и найдитеinclude-system-site-packages. Значениеtrueразрешает видеть системные пакеты,false— изолирует их по умолчанию. Не редактируйте этот файл в работающей среде ради быстрой очистки: лучше создать новую.
- Сохраните два снимка для сравненияВ активной venv выполните обычный
pip freezeи вариантpip freeze --local. При разрешённых системных пакетах--localисключает глобально установленные дистрибутивы. Если оба файла идентичны, причина лишних пакетов не обязательно в системной среде. - В активной venv; создаются два файла в текущей папкеLinux · Терминал (Bash)КомандаВ активной venv; создаются два файла в текущей папке.
python -m pip freeze > freeze-all.txtpython -m pip freeze --local > freeze-local.txt
- Определите, какие зависимости нужны самому проектуСравните записи с
requirements.txtилиpyproject.toml. Транзитивные зависимости тоже нужны и могут не фигурировать среди прямых требований. Не удаляйте всё, что не упомянуто в исходном файле: сначала изучите зависимости черезpip show ИМЯ_ПАКЕТА.
- Создайте чистое изолированное окружениеИз базового Python создайте новую
.venv-cleanбез флага--system-site-packages. Установите требования проекта и запустите тесты. Если библиотека неожиданно пропала, выясните, нужна ли она как явная зависимость, а не подключайте всю глобальную среду.Linux · Терминал (Bash)КомандаКаталог проекта, обычные права; лучше выполнить до изменения старой .venv.python -m venv .venv-clean
- Экспортируйте только проверенный наборПосле успешных тестов выполните
.venv-cleanPython с-m pip freezeи сохраните результат. Не заменяйте основной requirements.txt без оценки того, нужен ли проекту список прямых требований, а не полный снимок транзитивных пакетов.
- Перепроверьте независимость от системыЗапустите приложение из новой среды после закрытия исходного терминала. Если работа зависит от системного пакета, зафиксируйте и установите его как заявленную зависимость. При отсутствии подходящего wheel обратитесь к инструкции сборки конкретного проекта.
#Проверка результата и действия при неуспехе
В новой изолированной среде pip freeze отражает только установленные в ней пакеты, а проект проходит проверки. При использовании --local глобальные пакеты исключены из снимка.
Если исправление не помогло, вернитесь к точному сообщению об ошибке, сохраните версию Python, адрес целевого окружения и очищенный от секретов журнал; выясните, на каком шаге результат отличается от ожидаемого. Не изменяйте глобальный Python ради устранения сбоя проекта.