如何卸载使用distutils安装的程序?
我用这个setup.py安装了一个Python应用:
#!/usr/bin/env python
from distutils.core import setup
from libyouandme import APP_NAME, APP_DESCRIPTION, APP_VERSION, APP_AUTHORS, APP_HOMEPAGE, APP_LICENSE
setup(
name=APP_NAME.replace(" ","-").lower(),
version=APP_VERSION,
description=APP_DESCRIPTION,
author="John G",
author_email="xxx@gmail.com",
url=APP_HOMEPAGE,
license=APP_LICENSE,
scripts=["youandme.py"],
packages=["libyouandme"],
data_files=[
('share/applications', ['youandme.desktop']),
('usr/share/icons/hicolor/16x16/apps', ['icons/hicolor/16x16/apps/you.png']),
('usr/share/icons/hicolor/22x22/apps', ['icons/hicolor/22x22/apps/you.png']),
('usr/share/icons/hicolor/48x48/apps', ['icons/hicolor/48x48/apps/you.png'])],
)
我该如何从我的Ubuntu电脑上删除这个应用呢?
我可以用distutils来做到这一点吗?
5 个回答
从 pip 8.0.0 版本开始,当你运行 pip uninstall <package>
来卸载某个软件包时,如果这个软件包是操作系统预装的(可能是通过 python setup.py install 安装的),那么这个命令就不起作用了。
你会看到这样的错误信息:
检测到一个由 distutils 安装的项目('
<package>
'),我们无法卸载它。distutils 提供的元数据中没有包含已安装文件的列表,所以 pip 不知道该卸载哪些文件。
所以,对于这些软件包,你不能用 pip 来卸载,而是需要使用操作系统自带的包管理工具。
比如在 Ubuntu 系统上,你可以用 sudo apt-get remove python-<package>
来卸载它。
我发现有两个软件包存在这个问题:httplib2 和 six,用上面的方法我成功解决了这个错误。希望其他人也能觉得这个信息有用。
据我所知,只有pip可以用来卸载Python模块,所以如果你还没有安装pip,可以通过以下命令来安装它:
sudo easy_install pip
然后你就可以用pip来卸载你的模块了:
sudo pip uninstall <module_name>
这里的 module_name
是你在 setup
函数中传入的 name
参数的值。
补充:刚看到你在问题中标记了“python-3.x”,目前pip还没有3.x版本,所以如果你需要卸载一个Python 3.x的模块,这个回答就不适用了。
首先,安装一个叫做checkinstall的Ubuntu软件包。checkinstall
可以监控安装过程,并创建一个deb格式的软件包。这样,你就可以用普通的软件管理命令来删除这个软件。
接下来,使用checkinstall重新安装你想要的python模块或软件包。首先,切换到包含setup.py文件的目录,也就是你要安装的python模块或软件包所在的文件夹:
cd <PACKAGE_NAME>
然后:
sudo checkinstall -D --fstrans=no python setup.py install
这会创建一个.deb格式的软件包,并再次安装这个python模块。在这个过程中,你会被问到几个问题,默认的答案一般都可以直接使用。不过,如果setup.py文件在python模块的一个子目录里,比如“source”子目录,你可能需要更改一下.deb包的“名称”。
(保存下来的.deb包记录了这个python包是怎么安装的,之后用dpkg命令就可以删除这个python包。)
然后立即删除这个模块:
sudo dpkg -r <PACKAGE_NAME>
附注:我听说有些安装程序和checkinstall
不兼容,不过我自己从来没有遇到过问题。