如何卸载使用distutils安装的Python包?

96

您能否仅从Python安装中删除目录,或者是否需要删除任何残留文件?

13个回答

46
这取决于您在安装时传递的选项以及系统/软件包中 distutils配置文件 的内容。我认为除了通过这些方式指定的目录外,不会修改任何文件。
值得注意的是,distutils目前没有卸载命令
另外需要注意的是,删除软件包/egg可能会导致依赖项问题 - 像easy_install这样的实用程序尝试缓解此类问题。

4
请问您能否更新一下,直接回答问题中关于残留文件的部分? - S.Lott
我以为我做到了 - 没有在distutils配置和安装标志指定的目录之外创建任何文件,所以任何“残留”文件都存在于这些目录中。这因包而异。 - cdleary
2
@cdleary:谢谢,但我希望您只是澄清和加强您的答案,而不是添加一长串评论。 - S.Lott
2
@S.Lott:抱歉,我不知道你需要哪部分答案的澄清 - 你能更具体一些吗? - cdleary
1
2011-07-04 14:35:distutils2/packaging现在提供了一个remove函数和一个pysetup remove命令。 - Edward

20

需要删除的三个安装内容分别为:

  1. 包/模块
  2. 脚本
  3. 数据文件

在我的Linux系统上,它们位于以下目录中:

  1. /usr/lib/python2.5/site-packages
  2. /usr/bin
  3. /usr/share

但在Windows系统中,这些内容更可能完全位于Python发行目录中。我对OSX没有了解,不过它更可能遵循Linux的模式。


14

另一个基于时间戳的黑客技巧:

  1. 创建一个锚点:touch /tmp/ts
  2. 重新安装需要被删除的软件包:python setup.py install --prefix=<PREFIX>
  3. 删除比锚点文件更新的文件:find <PREFIX> -cnewer /tmp/ts | xargs rm -r

3
我不喜欢| xargs rm -r这段命令。我建议逐个文件夹进行手动操作。在ext4(和其他文件系统)上,这个find命令会列出所有文件夹。如果你的前缀是/usr,那么你将会删除/usr/* - Mateen Ulhaq

9

是的,直接删除distutils安装的任何东西是安全的,包括已安装的文件夹或.egg文件。当然,依赖该代码的任何内容将不再工作。

如果您想让它再次正常工作,只需重新安装即可。

顺便说一句,如果您正在使用distutils,请考虑使用多版本功能。它允许您安装任何单个包的多个版本。这意味着,如果您只想安装新版本而不想删除旧版本包,则无需删除旧版本包。


5
在Ubuntu 12.04中,我发现默认情况下您唯一需要查看的位置是在以下位置:/var/log/syslog
/usr/local/lib/python2.7/

只需删除相关的文件夹和文件,如果有的话!

有时候在 /usr/lib/python<2.7/3.6> 中。 - Vineet

5
安装--记录+使用xargs rm命令
sudo python setup.py install --record files.txt
xargs sudo rm -rf < files.txt

删除所有文件但保留空目录。

这并不理想,应该足以避免软件包冲突。

然后您可以根据需要手动完成工作,方法是阅读files.txt,或者更勇敢一些,自动化移除空目录。

一个安全的助手可能是:

python-setup-uninstall() (
  sudo rm -f files.txt
  sudo python setup.py install --record files.txt && \
  xargs rm -rf < files.txt
  sudo rm -f files.txt
)

本文在Python 2.7.6和Ubuntu 14.04下测试通过。


4

对于Windows系统下的Python:

python -m pip uninstall "package_keyword"
uninstall **** (y/n)?

如果使用distutils安装了包,则它将无法工作。 - Kefeng91

4
如果这是为了测试和/或开发目的,setuptools有一个develop命令,每次您进行更改时都会更新(因此您不必每次更改时都卸载并重新安装)。您也可以使用此命令卸载软件包。
如果您使用它,任何声明为脚本的内容都将被留下作为残留文件。

3

对于Windows 7操作系统,

控制面板 --> 程序 --> 卸载程序

,然后选择要卸载的Python包。


@Mauricio 我在列表中没有看到旧版本,但我可以在site-packages中看到egg文件。这是个问题吗? - user1329187
在我的Windows 10上起作用。 - Erick Guzmán

2

我刚刚卸载了一个Python包,虽然我不确定我是否完美地完成了这个过程,但我相信我做得还算可以。

首先,我获取了一个按日期排序的所有Python相关文件列表,因为我假设我的包中的所有文件将具有更或多或少相同的时间戳,而其他文件则没有。

幸运的是,我已经在/opt/Python-2.6.1下安装了Python;如果我使用的是Linux发行版自带的Python,那么我就必须搜索整个/usr目录,这将花费很长时间。

然后,我只需检查该列表,并松了一口气,因为我想要删除的所有内容都包括一个目录/opt/Python-2.6.1/lib/python2.6/site-packages/module-name/和一个文件/opt/Python-2.6.1/lib/python2.6/site-packages/module-x.x.x_blah-py2.6.egg-info

所以我只需要删除它们。

以下是如何获得按日期排序的文件列表:

find "$@" -printf '%T@ ' -ls | sort -n | cut -d\ -f 2-

(顺便说一下,我认为这必须是GNU“find”;你在OS X上得到的版本不知道“-printf'%T@'”)

我经常使用它。


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