如何卸载使用distutils安装的程序?

7 投票
5 回答
9084 浏览
提问于 2025-04-16 05:58

我用这个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 个回答

4

从 pip 8.0.0 版本开始,当你运行 pip uninstall <package> 来卸载某个软件包时,如果这个软件包是操作系统预装的(可能是通过 python setup.py install 安装的),那么这个命令就不起作用了。

你会看到这样的错误信息:

检测到一个由 distutils 安装的项目('<package>'),我们无法卸载它。distutils 提供的元数据中没有包含已安装文件的列表,所以 pip 不知道该卸载哪些文件。

所以,对于这些软件包,你不能用 pip 来卸载,而是需要使用操作系统自带的包管理工具。

比如在 Ubuntu 系统上,你可以用 sudo apt-get remove python-<package> 来卸载它。

我发现有两个软件包存在这个问题:httplib2six,用上面的方法我成功解决了这个错误。希望其他人也能觉得这个信息有用。

4

据我所知,只有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的模块,这个回答就不适用了。

6

首先,安装一个叫做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不兼容,不过我自己从来没有遇到过问题。

撰写回答