如何卸载使用pip install --user安装的软件包

301

pip 有一个 --user 选项,可以按用户安装 Python 包:

pip install --user [python-package-name]

我使用这个选项在一个我没有 root 权限的服务器上安装了一个软件包。现在我需要在当前用户下卸载已安装的软件包。我尝试执行了以下命令:

pip uninstall --user [python-package-name]

但是我得到了:

no such option: --user

我如何卸载使用pip install --user安装的软件包,而不是手动查找并删除该软件包?

我找到了这篇文章:

pip无法从每个用户的site-packages目录中卸载软件包

文章中描述了从用户目录中卸载软件包不受支持。根据该文章,如果正确实施,则可以通过以下方式卸载:

pip uninstall [package-name]

已安装的软件包也会在用户目录中搜索。但对我来说仍然存在一个问题。如果相同的软件包在系统范围和用户级别都安装了怎么办?如果有人需要针对特定的用户目录进行操作呢?


1
不,您必须为每个用户组设置一个虚拟环境,并为包含它的文件夹设置适当的系统权限。 - danius
5
无法在所有用户中安装软件包系统范围内,然后选择性地为某些用户卸载它。如果软件包是作为“--user”安装的,则不使用“--user”进行卸载将实现您想要的效果。 - tripleee
@tripleee:我没有系统范围的权限,也不想要,我只需要按当前用户卸载它。 - Serjik
1
找出您没有权限删除的目录,修复其权限或手动将其移动到一边。 - tripleee
7个回答

254

在Linux上使用Python 3.5和pip 7.1.2进行测试后,情况似乎是这样的:

  • pip install --user somepackage会安装到$HOME/.local,并且使用pip uninstall somepackage可以卸载它。

  • 无论是否同时在系统范围内安装了somepackage,这都是正确的。

  • 如果包同时被安装在两个位置,则只有本地安装的一个将被卸载。要使用pip在系统范围内卸载该软件包,请先在本地卸载它,然后再以root权限运行相同的卸载命令。

  • 除了预定义的用户安装目录外,pip install --target somedir somepackage还将该软件包安装到somedir中。通过pip没有办法从这种地方卸载软件包。(但是GitHub上有一个有些老的未合并的拉取请求,实现了pip uninstall --target。)

  • 由于pip只会从系统范围和预定义的用户本地卸载,因此您需要作为相应的用户运行pip uninstall,以从给定用户的本地安装目录中卸载。


2
在虚拟环境中运行pip,这些语句是否准确? - kbolino
1
在我的情况下,卸载pip 9.0.1并没有起作用,该软件包仍然安装在HOME/./local目录下。 - Saren Tasciyan
9
在我的系统上,第二点似乎不正确。我已经在/usr/lib64/python2.7/site-packages/中安装了一个系统包jedi。当我以普通用户身份执行以下命令:pip install --user jedi 然后 pip uninstall jedi 时,pip尝试卸载 /usr/lib64/python2.7/site-packages/jedi 并提示“权限被拒绝”。因此,如果卸载命令没有 --user 选项,我该如何告诉卸载命令不要尝试卸载/usr/lib64/python2.7/site-packages/jedi ,而是卸载~/.local/lib64/python3.6/site-packages/jedi - AstroFloyd
这里和@AstroFloyd完全一样。 - Nikana Reklawyks
你能否提供一下 pip uninstall --target 的未合并的 MR 链接? - Nam Vu

24

在 MacOS 上卸载“oauth2client”软件包的示例:

pip uninstall oauth2client

8
不确定为什么它有那么多赞,因为它是错误的答案。这并没有指定--user标志,如果你已经使用root和用户安装了软件包,那么用户安装的软件包将保留。 - misantroop
4
请仔细阅读答案。它陈述了与被接受的答案相同的内容(但解释较少)。 - user202729

20

我强烈建议您使用虚拟环境来安装Python包。使用virtualenv,您可以防止任何包冲突,并完全隔离与Python相关的用户空间命令。

要删除全局安装的所有软件包,请按照以下步骤进行操作:

可以卸载使用--user标志安装的包。以下是一个可行的方法;

pip freeze --user | xargs pip uninstall -y

对于Python 3,使用以下命令;

pip3 freeze --user | xargs pip3 uninstall -y

但不知何故,这些命令无法卸载setuptools和pip。在执行上述命令后(如果您确实需要整洁的Python环境),您可以使用以下命令将它们删除;

pip uninstall setuptools && pip uninstall pip

现在您有一个干净的Python环境。您可以创建虚拟环境并在其中安装软件包。


1
不错,它卸载了我曾经用--user标志安装的所有软件包!现在要在我的Anaconda环境中重新安装它们... - conor
1
是的,但要明确的是,这并没有回答原始问题,而是卸载了所有“用户”安装的软件包(因为pip freeze --user列出了所有使用--user安装的软件包),但在某些(有限)情况下仍然可能有用。 (要卸载使用--user安装的单个软件包{foo},只需运行pip uninstall {foo},正如被接受的答案所详细说明的那样。) - michael
1
@michael 你是对的。我正在编辑答案以适应问题。谢谢通知。 - thiras
1
他们不卸载setuptoolspip,因为它们通常在用户目录之外。至少在Linux上,这是正常情况,因为安装软件的工具应该始终是您系统的包管理器。 - anon

19

但是要注意,在虚拟环境中使用 pip install --user some_pkg 的人需要小心。

$ path/to/python -m venv ~/my_py_venv
$ source ~/my_py_venv/bin/activate
(my_py_venv) $ pip install --user some_pkg
(my_py_venv) $ pip uninstall some_pkg
WARNING: Skipping some_pkg as it is not installed.
(my_py_venv) $ pip list
# Even `pip list` will not properly list the `some_pkg` in this case

在这种情况下,您需要停用当前的虚拟环境,然后使用相应的python/pip可执行文件来列出或卸载用户站点包:
(my_py_venv) $ deactivate
$ path/to/python -m pip list
$ path/to/python -m pip uninstall some_pkg

注意,这个问题几年前就有人报告了。而现在的结论是:在虚拟环境的pip中,--user不是有效的,因为用户位置对于虚拟环境来说并没有意义。

8
太晚了!我在虚拟环境中使用了“--user”,有没有办法撤销这个操作?因为“pip list”无法正常工作…… - jnfran92
4
目前的结论是:在虚拟环境的 pip 中 user 不可用,因为用户位置对于虚拟环境来说没有实际意义。同意。用户安装违背了虚拟环境的整个目的。不幸的是,有很多人会犯这种错误。 - Stephen Bosch

5
答案是目前还不可能。您必须手动删除它。

在安装一个软件包时,出现了回溯错误。此后卸载就再也无法正常工作了。 - syam
如何列出给定软件包的所有pip安装文件(以便我可以删除它们)? - AstroFloyd
1
这是实际上不可能的,因为pip运行setup.py,而setup.py运行外部代码。在setup.py完全被移除之前,请忘记它,可能要等到2022年才能实现。 - sorin

2

正如@thomas-lotze所提到的,目前pip工具并没有相应的--user选项。但我发现,我可以检查~/.local/bin目录,并寻找特定的pip#.#,这个看起来就像是对应于--user选项。

在我的情况下:

antho@noctil: ~/.l/bin$ pwd
/home/antho/.local/bin
antho@noctil: ~/.l/bin$ ls pip*
pip  pip2  pip2.7  pip3  pip3.5

然后只需使用特定的pip版本进行卸载。

请参考 https://dev59.com/R2gu5IYBdhLWcg3winrU#11250821 以获取卸载所有非可编辑模式安装的包的命令,例如 ./pip2 freeze | grep -v "^-e" | xargs pip uninstall -y - matt wilkie

1

我正在运行Anaconda 4.3.22版本和Python 3.6.1环境,并遇到了这个问题。以下是历史记录和解决方法:

pip uninstall opencv-python # -- the original step. failed.

ImportError: DLL load failed: The specified module could not be found.

我在我的Python3.6环境中执行此操作时出现了错误。
python -m pip install opencv-python # same package as above.
conda install -c conda-forge opencv # separate install parallel to opencv
pip-install opencv-contrib-python # suggested by another user here. doesn't resolve it.

接下来,我尝试下载Python3.6并将python3.dll放入文件夹以及不同的文件夹中,但没有任何改变。

最后,这个方法解决了问题:

pip uninstall opencv-python

(另一个conda-forge版本仍然安装着)这只剩下了conda版本,它可以在3.6中工作。

>>>import cv2
>>>

工作中!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接