Python 如何使用pip正确处理冲突的distutils库?

Python 如何使用pip正确处理冲突的distutils库?,python,pip,Python,Pip,将pip版本升级到10.0.0后,如果与distutils安装包存在版本冲突,则pip安装失败: 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

pip
版本升级到
10.0.0
后,如果与distutils安装包存在版本冲突,则pip安装失败:

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获取
(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
降级到旧版本

那么,用pip处理冲突的distutils库的最佳实践是什么


Ps:我认为
pip
是为了方便管理
Python
库,但这次事件使它变得足够复杂。

Python的虚拟环境可能有助于处理冲突库,即使是较新版本的
pip

安装虚拟化
Python3
内置了虚拟环境。在
Python2
的情况下,
virtualenv
可用于此目的

使用以下命令设置
virtualenv

sudo pip install virtualenv
venv_path="${HOME}/py_venv"
mkdir -p "${venv_path}"
virtualenv "${venv_path}"
(py_venv) my_user@my_machine:~$ which ansible
/home/my_user/py_venv/bin/ansible
(py_venv) my_user@my_machine:~$ pip uninstall urllib3
Skipping urllib3 as it is not installed.
它可以通过
命令激活

source "${venv_path}/bin/activate"
(py_venv) my_user@my_machine:~$
(py_venv) my_user@my_machine:~$ deactivate
my_user@my_machine:~$
可通过
停用
命令停用

source "${venv_path}/bin/activate"
(py_venv) my_user@my_machine:~$
(py_venv) my_user@my_machine:~$ deactivate
my_user@my_machine:~$
确认python和pip的路径 请注意,默认情况下,使用
sudo
执行不会指向virtualenv

(py_venv) my_user@my_machine:~$ sudo which python
/usr/bin/python
(py_venv) my_user@my_machine:~$ sudo which pip
/usr/local/bin/pip
使用pip安装/卸载软件包 已成功安装在
virtualenv

sudo pip install virtualenv
venv_path="${HOME}/py_venv"
mkdir -p "${venv_path}"
virtualenv "${venv_path}"
(py_venv) my_user@my_machine:~$ which ansible
/home/my_user/py_venv/bin/ansible
(py_venv) my_user@my_machine:~$ pip uninstall urllib3
Skipping urllib3 as it is not installed.
virtualenv

sudo pip install virtualenv
venv_path="${HOME}/py_venv"
mkdir -p "${venv_path}"
virtualenv "${venv_path}"
(py_venv) my_user@my_machine:~$ which ansible
/home/my_user/py_venv/bin/ansible
(py_venv) my_user@my_machine:~$ pip uninstall urllib3
Skipping urllib3 as it is not installed.
在真实环境中卸载相同的软件包

(py_venv) my_user@my_machine:~$ deactivate
my_user@my_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
库,而无需接触任何系统软件包。

没有唯一的最佳解决方案。语言包管理器(如
pip
npm
)与操作系统包管理器(
apt
rpm
)冲突,解决冲突的方法很多。对于某些软件包,您只需手动删除文件/目录。对于某些情况,您可以使用
apt
删除它们,然后使用
pip
重新安装。需要通过
activate path/to/your/virtualenv
激活虚拟环境。更多信息