Как удалить программу, установленную с distutils? - PullRequest
6 голосов
/ 23 октября 2010

Я установил приложение Python с этим setup.py:

#!/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 ]

6 голосов
/ 23 октября 2010

Установите пакет Ubuntu checkinstall. checkinstall контролирует процедуру установки и создает пакет deb. Это позволяет использовать обычные команды управления пакетами для удаления программного обеспечения.

Сначала переустановите потенциальный модуль / пакет python, используя checkinstall. Перейдите в каталог, содержащий файл setup.py потенциального модуля / пакета python:

cd <PACKAGE_NAME>

Тогда:

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

Это создает пакет .deb и снова устанавливает модуль python. Вам зададут несколько вопросов. Ответы по умолчанию должны быть в порядке. (Но вы можете изменить «имя» пакета .deb, когда файл setup.py находится в подкаталоге модуля python, например, в подкаталоге «source».)

(Сохраненный пакет .deb теперь фиксирует, как сам пакет python установился, и dpkg может удалить пакет python.)

Затем немедленно удалите модуль:

sudo dpkg -r <PACKAGE_NAME>

PS. Я слышал, что некоторые программы установки несовместимы с checkinstall, хотя сам никогда не сталкивался с какими-либо проблемами.

4 голосов
/ 23 октября 2010

AFAIK only pip позволяет удалить модули Python, поэтому, если у вас его нет, вы можете установить его с помощью

sudo easy_install pip

, а затем использовать pip для удаления вашего модуля

sudo pip uninstall <module_name>

где module_name - это значение, переданное в аргументе name функции setup.

Редактировать: только что увидел, что вы пометили свой вопрос как "python-3.x ", и пока нет версии 3.x для pip, поэтому, если вам нужно удалить модуль python3.x, этот ответ не подходит.

3 голосов
/ 21 января 2016

Поскольку pip 8.0.0 работает pip uninstall <package> не работает, когда <package> - это то, что было предустановлено операционной системой (возможно, при установке python setup.py).

Сообщение об ошибке:

Обнаружен установленный проект distutils ('<package>'), который мы не можем удалить. Метаданные, предоставляемые distutils, не содержат список установленных файлов, поэтому pip не знает, какие файлы удалить.

Вместо того, чтобы использовать pip для удаления этих пакетов, вам нужно использовать менеджер пакетов ОС.

Итак, в Ubuntu: sudo apt-get remove python-<package> удалит его.

Я нашел два пакета с этой проблемой: httplib2 и six , и вышеупомянутая уловка помогла мне справиться с этой ошибкой. Надеюсь, что другие найдут это полезным.

2 голосов
/ 23 октября 2010

Disutils версии 1 не поддерживает команду удаления, и я также включил ссылку для вас в комментарии, чтобы увидеть ее, но только для информации disutils2 теперь поддерживает команду удаления, они работали над ней в прошлом GSoC, Вы можете проверить эту ссылку

Единственный способ для вас «удалить» ваш пакет - удалить все файлы вручную, я вижу, что у вас есть некоторые файлы в / usr / share .., я не знаю, знаете ли вы это уже, но вы можете использовать python install.py development при разработке вашего модуля, он легко изменит и удалит.

0 голосов
/ 01 мая 2018

Я обнаружил, что при установке новой версии библиотеки 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'] )
...