Как правильно обрабатывать конфликтующие библиотеки distutils с помощью pip?

После обновления версии pip до 10.0.0 установка с помощью pip завершится с ошибкой, если конфликт версий с установленным пакетом distutils:

Cannot uninstall '***'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

Это может быть для PyYAML, pyOpenSSL, urllib3, chardet и т.д.

Я пытаюсь решить эту проблему, удалив соответствующие пакеты, такие как;

python-yaml python-openssl python-urllib3 python-chardet

с apt-get (Ubuntu), а затем снова установите эти библиотеки с помощью pip

Однако, как и следовало ожидать, удаление apt-get также приводит к удалению многих зависимых дополнительных системных пакетов, что, по-видимому, не является хорошей практикой:

The following packages will be REMOVED:
apt-xapian-index cloud-init landscape-client-ui-install oneconf python-aptdaemon python-aptdaemon.gtk3widgets python-chardet python-cupshelpers python-debian python-openssl python-pip python-requests python-ubuntu-sso-client python-urllib3 python-yaml sessioninstaller software-center ssh-import-id system-config-printer-common system-config-printer-gnome system-config-printer-udev ubuntu-desktop ubuntu-release-upgrader-gtk ubuntu-sso-client ubuntu-sso-client-qt update-manager update-notifier update-notifier-common

Я также не хочу понижать pip до более старой версии.

Итак, что лучше всего обрабатывать конфликтующие библиотеки distutils с помощью pip?

Ps: Я предположил, что pip предназначен для простого управления библиотеками Python но этот инцидент делает его достаточно сложным.

Ответ 1

Виртуальная среда Python может помочь обрабатывать конфликтующие библиотеки даже с более новыми версиями pip

Настройка virtualenv

Python3 имеет встроенную виртуальную среду. В случае Python2 для этой цели можно использовать virtualenv.

Используйте следующие команды для настройки virtualenv

sudo pip install virtualenv
venv_path="${HOME}/py_venv"
mkdir -p "${venv_path}"
virtualenv "${venv_path}"

Он может быть активирован командой source

source "${venv_path}/bin/activate"
(py_venv) [email protected]_machine:~$

и может быть деактивирована командой deactivate

(py_venv) [email protected]_machine:~$ deactivate
[email protected]_machine:~$

Подтвердить пути для python и pip

(py_venv) [email protected]_machine:~$ which python
/home/my_user/py_venv/bin/python
(py_venv) [email protected]_machine:~$ which pip
/home/my_user/py_venv/bin/pip

Помните, что по умолчанию выполнение с помощью sudo не указывает на virtualenv

(py_venv) [email protected]_machine:~$ sudo which python
/usr/bin/python
(py_venv) [email protected]_machine:~$ sudo which pip
/usr/local/bin/pip

Установка/удаление пакетов с помощью pip

(py_venv) [email protected]_machine:~$ pip install ansible

Успешно установлено в virtualenv

(py_venv) [email protected]_machine:~$ which ansible
/home/my_user/py_venv/bin/ansible

Удалите конфликтующий системный пакет в virtualenv

(py_venv) [email protected]_machine:~$ pip uninstall urllib3
Skipping urllib3 as it is not installed.

Удалите один и тот же пакет в реальной среде

(py_venv) [email protected]_machine:~$ deactivate
[email protected]_machine:~$ pip uninstall urllib3
Cannot uninstall 'urllib3'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

Как можно увидеть с помощью виртуальной среды Python, становится возможным использовать более новые версии pip для установки и удаления библиотек Python не касаясь системных пакетов.