pip无法卸载软件包

38

背景

我正在进行一项学术项目,基本上是分析一些“谁关注谁”的图表,并希望使用 Python Twitter API 包之一构建一些小数据集来获取一些真实的数据以测试我所拥有的一些想法。

我有点粗心大意,安装了两个包:

a) python-twitter0.8.2 (http://pypi.python.org/pypi/python-twitter/0.8.2)

b) twitter1.9.1 (http://pypi.python.org/pypi/twitter/1.9.1)

(a) 在 pypi 中称为 python-twitter,而 (b) 称为 twitter,这就是我将要引用它们的方式。

在 Python 解释器中,这两者都被称为 import twitter,但当我写下那一行时,我总是得到 twitter(如果我能弄清楚如何使用 python-twitter,我就可以继续进行,但仍然会有相同的根本问题)。


问题

由于我不需要 twitter 包,因此我决定使用 pip 卸载它:

$ sudo pip uninstall twitter

这会输出:

Uninstalling twitter:
Proceed (y/n)? y
  Successfully uninstalled twitter

(实际上,我尝试使用python-twitter做同样的事情并得到类似的响应。)

然而,当运行pip freeze时,这两个软件包都会出现在已安装列表中!事实上,我仍然可以成功地在解释器中使用import twitter命令。显然,这些软件包没有被卸载。我想知道如何卸载它们!


其他信息

我正在使用Python 2.7和Ubuntu 12.04。

当我使用IDLE而不是shell解释器运行,并键入help('modules')时,twitterpython-twitter都不会显示在列表中。当在shell解释器中键入help('modules')时,我会收到分段错误的错误提示,并且解释器会崩溃。以下是错误信息:

>>> help('modules')

Please wait a moment while I gather a list of all available modules...

/usr/lib/python2.7/dist-packages/gobject/constants.py:24: Warning:
  g_boxed_type_register_static: assertion `g_type_from_name (name) == 0' failed
  import gobject._gobject
/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:40: Warning:
  g_boxed_type_register_static: assertion `g_type_from_name (name) == 0' failed
  from gtk import _gtk

** (python:2484): CRITICAL **: pyg_register_boxed: assertion `boxed_type != 0' failed
/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:40: Warning: cannot register
existing type `GdkDevice'
  from gtk import _gtk
/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:40: Warning: g_type_get_qdata: 
assertion `node != NULL' failed
  from gtk import _gtk
Segmentation fault (core dumped)

为什么其他问题没有解决我的问题:

我查看了类似的帖子pip freeze lists uninstalled packages,但我没有遇到相同的问题。


$ sudo which pip
/usr/bin/pip
$ which pip
/usr/bin/pip

这两个命令的输出结果是相同的。此外,$ sudo pip freeze$ pip freeze 命令的输出结果也是相同的。

非常感谢任何帮助!


2
import twitter; print twitter.__file__ 这段代码的输出是什么? - Martijn Pieters
>>> print twitter.__file__产生的结果是:/usr/local/lib/python2.7/dist-packages/twitter/__init__.pyc - David
5个回答

58

您可以随时手动删除软件包;您可以运行:

sudo rm -rf /usr/local/lib/python2.7/dist-packages/twitter

要从您的dist-packages目录中删除该软件包。您可能需要编辑同一目录中的easy-install.pth文件,并删除其中的twitter条目。


@DavidBodow:那解决了你的问题吗? - Martijn Pieters
6
好的,这件事刚刚发生在我身上。有人知道是什么原因引起的吗? - Brett Widmeier
2
@BrettWidmeier,问题的原因是在debian版本的pip中进行了一些修改,这也是ubuntu软件包的源。请参见下面的答案。 - oz123
1
请注意,树莓派上的某些软件包位于 /usr/lib/python<x> 而不是 /usr/local/lib/python<x>。 - Danny Staple
1
@DannyStaple:你的Python安装位置取决于你如何安装Python以及你的发行版。使用python -m site命令,让Python告诉你它在哪里查找包(在sys.path列表中查找site-packages条目)。 - Martijn Pieters
显示剩余3条评论

15

虽然马丁的解决方案可以解决问题,但它并没有直接回答你的问题。

在你的Ubuntu版本(12.04)中,pip的版本为:

 python-pip (1.0-1build1)

这也是适用于Debian Wheezy的相同版本。该版本存在一个奇怪的bug,导致软件包无法被删除。
如果您使用脚本get-pip.py从上游获取pip,则将拥有一个修复版本的pip,可以删除软件包(截至目前v.1.5.6)。

更新

Python的pip确实是一个快速发展的目标。因此使用Debian或Ubuntu的pip保证会有错误。请不要使用这些分发版的pip。 相反,请从上游安装pip。

如果您希望将pip安装的软件包注册为系统软件包,我真的建议您还使用stdeb


4
你可以在这里获取 get-pip.py 文件:http://pip.readthedocs.org/en/latest/installing.html。 - hitzg
以下是一些链接,可以更深入地了解这个永无止境的故事(至少在Ubuntu 14.10之前):Debian错误报告日志Ubuntu Utopic(14.10)中确认的错误(也被我的个人经验所证实)。 - help_asap

4

我在升级软件包时遇到了困难,因为pip无法成功卸载它。我不得不删除/usr/lib/python2.7/dist-packages中的.egg-info文件和文件夹,然后尝试使用--upgrade重新安装,这样就可以了。


3

对于我来说,这是因为我使用了pip freeze, 这给我带来的结果与sudo pip freeze不同。

由于我正在使用sudo进行卸载,因此它没有在“非sudo”会话中卸载。不使用sudo进行卸载可以解决这个问题。


虽然这并没有直接解决我的问题,但它提醒我 pip3 install 不一定等同于 sudo pip3 install,这间接帮助我解决了问题。 - ndmeiri

1
在我的情况下(从pyusb 0.4x升级到1.0x),使用apt-get remove python-usb命令删除旧软件包,然后通过python setup.py手动安装已下载的软件包,这样虽不太美观但可行。

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