如何删除安装了distutils的程序?

时间:2010-10-23 17:25:56

标签: python ubuntu python-3.x 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 个答案:

答案 0 :(得分:6)

安装checkinstall Ubuntu软件包。 checkinstall监视安装过程并创建deb包。这使您可以使用常规程序包管理命令来删除软件。

首先,使用checkinstall重新安装候选python模块/包。将目录更改为包含候选python模块/包的setup.py文件的目录:

cd <PACKAGE_NAME>

然后:

sudo checkinstall -D --fstrans=no python setup.py install

这将创建一个.deb包,并再次安装python模块。 你会被问到几个问题。默认答案应该没问题。 (但是当setup.py文件位于python模块的子目录中时,您可能会更改.deb包的“名称”,例如“source”子目录。)

(保存的.deb包现在捕获python包自身的安装方式,dpkg可以删除python包。)

然后立即删除模块:

sudo dpkg -r <PACKAGE_NAME>

PS。我听说有些安装程序与checkinstall不兼容,但我自己从未遇到过任何问题。

答案 1 :(得分:4)

AFAIK only pip允许卸载python模块,所以如果你没有安装它,你可以用

安装它。
sudo easy_install pip

然后使用pip卸载模块

sudo pip uninstall <module_name>

其中module_namename函数的setup参数中传递的值。

编辑:刚看到你用“python-3.x”标记了你的问题,而pip还没有3.x版本,所以如果你需要卸载python3.x模块,这个答案不合适。

答案 2 :(得分:3)

由于pip uninstall <package>是操作系统预先安装的(可能是python setup.py install),因此运行<package>的pip 8.0.0不起作用。

错误消息是:

  

检测到我们无法卸载的distutils已安装项目('<package>')。 distutils提供的元数据不包含已安装的文件列表,因此pip不知道要卸载哪些文件。

您需要使用操作系统软件包管理器,而不是使用pip卸载这些软件包。

所以在Ubuntu上:sudo apt-get remove python-<package>会删除它。

我发现有两个有这个问题的软件包: httplib2 六个,上面的技巧帮助我解决了这个错误。希望其他人觉得这很有用。

答案 3 :(得分:2)

disutils版本1不支持uninstall命令,我还在注释中包含了一个链接,但是只是对于信息disutils2现在支持uninstall命令,他们在过去的GSoC中一直在使用它,你可以查看link

你“卸载”你的软件包的唯一方法是手动删除你的所有文件,我可以看到你在/ usr / share中有一些文件..我不知道你是否已经知道这个但是您可以在开发模块时使用python install.py develop,它将进行更改和轻松删除。

答案 4 :(得分:0)

我发现在安装新版本的库时,distutils没有删除不再属于该软件包的旧模块。它只取代了旧的。这是一个简单的示例,说明在运行安装程序之前如何卸载旧文件。它本身并不是一个完整而完美的卸载,但它可能会帮助那些有相同需求的人,或者向您发送功能性的解决方法路径。

from distutils.core import setup
import distutils.sysconfig
from os import path
from shutil import rmtree

PACKAGE_NAME = "MyPackage"

# If found, uninstall a prior version.
# This will delete any modules that are no longer in use.
targetDirPath = path.join( distutils.sysconfig.get_python_lib(), PACKAGE_NAME )
if path.exists( targetDirPath ) :
    try :
        rmtree( targetDirPath )
        print "Removed prior package at: %s" % (targetDirPath,)
    except Exception as e:    
        print "Failed to remove prior package at: %s" % (targetDirPath,)
        print e

setup(name=PACKAGE_NAME,
      version='1.2.3',
      packages=['subpackage'] )