Как исправить ошибку "error: externally-managed-environment" при использовании pip 3?
При выполнении команды pip install xyz
на машине под управлением Linux (например, Debian или Ubuntu или производных дистрибутивах) я получаю следующую ошибку:
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.
If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.
If you wish to install a non-Debian packaged Python application,
it may be easiest to use pipx install xyz, which will manage a
virtual environment for you. Make sure you have pipx installed.
See /usr/share/doc/python3.11/README.venv for more information.
note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
Что означает эта ошибка? Как мне её избежать? Почему команда pip install xyz
не работает так, как раньше, после того как я обновил свою систему с помощью sudo apt upgrade
?
5 ответ(ов)
Флаг --break-system-packages
в pip
позволяет обойти ошибку externally-managed-environment
и установить Python-пакеты в системную директорию.
pip install package_name --break-system-packages
Важно: Не стоит злоупотреблять использованием этого флага.
На данный момент некоторые из самых популярных ответов предлагают вам способы игнорировать эту проблему. Это похоже на совет принимать обезболивающие для устранения боли от осколков стекла в горле, а не на указание прекратить есть осколки стекла. Перестаньте есть осколки стекла. Существуют гораздо лучшие способы установки пакетов из PyPI, чем использование флага --break-system-packages
или, что еще хуже, удаление файла EXTERNALLY-MANAGED
.
Ошибка сообщает вам, что среда управляется извне. В вашей дистрибутиве Debian уже есть инструменты для установки библиотек Python с помощью APT. Например, если вы хотите установить библиотеку Python requests
, вы можете выполнить команду:
sudo apt install python3-requests
Эти файлы будут установлены в /usr/lib/python3/dist-packages/
, что подтверждается выводом команды dpkg -L
:
$ dpkg -L python3-requests
/usr/lib/python3/dist-packages/requests
/usr/lib/python3/dist-packages/requests/__init__.py
/usr/lib/python3/dist-packages/requests/__version__.py
/usr/lib/python3/dist-packages/requests/_internal_utils.py
# ...
Если вы выполните pip install requests
, где должны быть установлены файлы? Должны ли они устанавливаться в /usr/lib/python3
, в ~/.local/lib/python3/site-packages/
или где-то еще? Версия, установленная из PyPI с помощью pip, может отличаться от версии, включенной в пакет Debian. Что если перезапись не удастся? Что если у вас установлены два пакета requests
системного уровня? Должен ли pip научиться удалять пакеты APT? Возможно, у вас есть сотни пакетов Debian, зависящих от Python; что произойдет, если один из них сломается из-за конфликтующих версий requests
? Можете ли вы легко отменить установку через pip
? Поймете ли вы, что странные ошибки, которые вы испытываете при запуске gedit
или что-то подобное, связаны с этим? Это кажется рецептом катастрофы. Ранее вы могли использовать pip
для установки пакетов Python на системном уровне, и это вызывало так много проблем, что теперь он выдает это сообщение об ошибке.
Итак, что же можно сделать вместо этого?
1. Устанавливайте пакеты с помощью APT
Вы можете устанавливать пакеты Python на системном уровне с помощью APT. Например, вы можете установить requests
так:
sudo apt install python3-requests
Эта версия может быть не самой последней в PyPI. И не все пакеты на PyPI упакованы для Debian. Но не волнуйтесь, существуют и другие решения.
Или: 2. Используйте pip
в виртуальном окружении
Если вы еще не выучили инструмент для настройки виртуального окружения, я настоятельно рекомендую это сделать. Каждый программист на Python должен это знать. Я рекомендую venv
или virtualenv
для начинающих. Чтобы установить venv
, выполните команду:
sudo apt install python3-venv
Затем создайте виртуальное окружение в вашей проектной директории вот так:
python3 -m venv .venv
Теперь активируйте ваше виртуальное окружение, выполнив:
source .venv/bin/activate
Это изменит переменную окружения PATH
, чтобы включить .venv/bin/
. Теперь вы можете устанавливать пакеты из PyPI с помощью pip в вашем виртуальном окружении (в данном случае .venv/
), вот так:
pip install requests
Если вы не хотите активировать и деактивировать виртуальные окружения, вы можете запускать pip
и python
напрямую из виртуального окружения, вот так:
$ .venv/bin/pip install requests
$ .venv/bin/python
>>> import requests
>>>
Или: 3. Используйте pipx
pipx
— отличный инструмент для установки командных приложений напрямую из PyPI. Чтобы установить pipx
, выполните:
sudo apt install pipx
Убедитесь, что ~/.local/bin/
находится в вашей переменной окружения PATH
, выполнив эту команду:
pipx ensurepath
Закройте терминал и откройте его снова для применения изменений.
Теперь вы можете установить командное приложение из PyPI. За кулисами pipx создаст виртуальное окружение для каждого приложения с его зависимостями, полностью изолированное от остальной системы, чтобы предотвратить проблемы. Это великолепно. Вот пример:
$ pipx install ruff
$ ruff --help
Или: 4. Используйте --break-system-packages
Если вам абсолютно необходимо есть осколки стекла, вы можете воспользоваться опцией --break-system-packages
, вот так:
pip install --break-system-packages requests
Никогда не удаляйте и не переименовывайте /usr/lib/python3.12/EXTERNALLY-MANAGED
. Этот файл предназначен для того, чтобы предотвратить повреждение вашей системы. Вы можете не заметить, что ваша система сломана, вплоть до недель или месяцев, и в тот момент вы не поймете, почему это произошло. Если необходимо игнорировать эти защиты, делайте это на одноразовой основе с помощью --break-system-packages
.
Чтобы создать виртуальное окружение в вашем домашнем каталоге, выполните следующую команду:
python3 -m venv ~/.local --system-site-packages
Убедитесь, что ~/.local/bin
добавлен в ваш $PATH
.
После этого вы можете использовать:
~/.local/bin/pip install ... # --user подразумевается ;)
Также вы можете создать собственный каталог, например ~/py
, и инициализировать всё оттуда. Однако, по-моему, *.local*
уже учитывается в PATH
и каталогах для импорта.
Команда rm /usr/lib/python3.11/EXTERNALLY-MANAGED
удаляет файл или директорию с указанным путем. В данном случае это может привести к проблемам с управлением установленными библиотеками Python, так как данный файл служит индикатором для систем, управляющих установкой пакетов (например, pip
или apt
), о том, что пакеты Python установлены не вручную, а через менеджер пакетов.
В большинстве случаев, вам не следует удалять этот файл, так как это может вызвать конфликты или ошибки при установке новых библиотек или их обновлениях. Если вам необходимо установить или обновить пакеты, рассмотрите возможность использования pip
с флагом --user
для установки на уровне пользователя или воспользуйтесь виртуальным окружением (например, venv
), чтобы избежать проблем с системной установкой Python.
Если у вас есть конкретная проблема, с которой вы столкнулись, пожалуйста, укажите ее, и я постараюсь помочь вам более детально.
Если вам нужно установить пакет, который будет работать на всех платформах — Windows, Linux, MacOS, Android, Raspberry Pi — вы можете использовать следующую команду pip. Добавьте параметр --break-system-packages
, чтобы избежать проблем с системными пакетами:
pip install package-name --break-system-packages
Обратите внимание, что использование этого параметра может повлиять на системные зависимости, поэтому рекомендуется использовать его с осторожностью.
Узнать, какая версия пакета установлена с помощью pip
Как заставить pip переустановить текущую версию?
Как справиться с несколькими версиями Python и PIP?
Установить Python-пакет в другую директорию с помощью pip?
Можно ли использовать pip для установки пакета из приватного репозитория GitHub?