python setup.py удалить

787

Я установил пакет Python с python setup.py install.

Как мне удалить его?

ЭЛЕКТРОДИСТАНЦИОННАЯ СИСТЕМА УПРАВЛЕНИЯ
источник
52
Принятый ответ устарел. Использование pip uninstall <your_package>. См. Stackoverflow.com/questions/1231688/… .
Иоахим W
21
pip uninstall больше не является правильным ответом. Вот доказательство. [sri @ localhost python] $ pip uninstall foo УСТАРЕВАНИЕ: удаление установленного distutils проекта (foo) устарело и будет удалено в следующей версии. Это связано с тем, что удаление проекта distutils приведет к удалению проекта только частично.
строптивая
@shrewmouse, который больше не показывает.
JC Rocamonde
@JCRocamonde С пакетом, который я создал, последняя версия пипа показывает, It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.что это все еще проблема.
Джош
@Josh в верхней части файла setup.py выполните «из настройки импорта setuptools» вместо «из настройки импорта distutils.core».
Bigjake

Ответы:

977

Примечание: избегайте python setup.py installиспользованияpip install .

Вам необходимо удалить все файлы вручную, а также отменить любые другие действия, которые установка выполняла вручную.

Если вы не знаете список всех файлов, вы можете переустановить его с помощью --recordопции и взглянуть на этот список.

Для записи списка установленных файлов вы можете использовать:

python setup.py install --record files.txt

Если вы хотите удалить, вы можете использовать xargs для удаления:

xargs rm -rf < files.txt

Или, если вы используете Windows, используйте Powershell:

Get-Content files.txt | ForEach-Object {Remove-Item $_ -Recurse -Force}

Затем удалите также содержащий каталог, например, /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/my_module-0.1.egg/на macOS. У него нет файлов, но Python все равно импортирует пустой модуль:

>>> import my_module
>>> my_module.__file__
None

После удаления Python показывает:

>>> import my_module
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'my_module'
Мартин против Лёвиса
источник
6
Если это не работает, добавьте sudo следующим образом:cat files.txt | xargs sudo rm -rf
saroele
21
Это испортит файлы с пробелами. Смотрите мой ответ ниже: stackoverflow.com/a/25209129/14456
Ян Келлинг
1
Как я могу переустановить пакет, у меня есть исходный код использования setup.py из него?
ア レ ッ ク ス
5
Это также оставляет пустые каталоги на их месте.
Dilawar
3
Привет, я попробовал ваше предложение, для некоторых файлов, когда я пытаюсь cat files.txt | xargs rm -rf говорит, что разрешение запрещено, даже в режиме sudo, например, для / usr / local / bin / pydoc или / usr / local / bin / idle. Есть идеи, почему?
212

Для меня в основном работает следующее:

установить пункт, например:

$ easy_install pip

Проверьте, как называется ваш установленный пакет с точки зрения pip:

$ pip freeze

В этом списке будут перечислены все пакеты, которые вы установили (и которые были обнаружены pip). Имя может быть когда-нибудь длинным, тогда используйте только имя пакета, отображаемого в и после #egg=. Вы также можете в большинстве случаев игнорировать часть версии (что следует ==или -).

Затем удалите пакет:

$ pip uninstall package.name.you.have.found

Если он запрашивает подтверждение об удалении пакета, то вы счастливчик, и он будет удален.

pip должен обнаружить все пакеты, которые были установлены с помощью pip. Он также должен обнаружить большинство пакетов, установленных с помощью easy_install или setup.py, но в некоторых редких случаях это может привести к сбою.

Вот реальный пример из моего локального теста с пакетом, названным ttr.rdstmcв MS Windows.

$ pip freeze |grep ttr
ttr.aws.s3==0.1.1dev
ttr.aws.utils.s3==0.3.0
ttr.utcutils==0.1.1dev

$ python setup.py develop
.....
.....
Finished processing dependencies for ttr.rdstmc==0.0.1dev

$ pip freeze |grep ttr
ttr.aws.s3==0.1.1dev
ttr.aws.utils.s3==0.3.0
-e hg+https://vlcinsky@bitbucket.org/vlcinsky/ttr.rdstmc@d61a9922920c508862602f7f39e496f7b99315f0#egg=ttr.rdstmc-dev
ttr.utcutils==0.1.1dev

$ pip uninstall ttr.rdstmc
Uninstalling ttr.rdstmc:
  c:\python27\lib\site-packages\ttr.rdstmc.egg-link
Proceed (y/n)? y
  Successfully uninstalled ttr.rdstmc

$ pip freeze |grep ttr
ttr.aws.s3==0.1.1dev
ttr.aws.utils.s3==0.3.0
ttr.utcutils==0.1.1dev

Редактировать 2015-05-20

Все, что написано выше, по-прежнему применимо, так или иначе, сейчас есть небольшие модификации.

Установите pip в python 2.7.9 и python 3.4

Последние версии Python поставляются с пакетом, ensurepipпозволяющим устанавливать pip даже в автономном режиме:

$ python -m surepip --upgrade

В некоторых системах (например, в Debian Jessie) это недоступно (чтобы предотвратить нарушение установки Python в системе).

Используя grepилиfind

Примеры выше предполагают, что вы grepустановили. У меня был (в то время, когда на моем компьютере была MS Windows) установлен набор утилит linux (включая grep). В качестве альтернативы используйте родную MS Windows findили просто игнорируйте эту фильтрацию и найдите имя в более длинном списке обнаруженных пакетов Python.

Ян Влчинский
источник
1
какой упаковочный инструмент / версию вы используете для этого? ( distutilsи distributeт. д.)
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
Я использую setuptools. Вы можете проверить bitbucket.org/vlcinsky/ttr.aws.utils.s3 (что не идеально). В любом случае, я весьма недоволен использованием пакетов пространства имен, иногда импорт прерывается без видимой причины. Но это другая история.
Ян Влчинский
1
исправляя себя. Даже при том, что я импортирую setuptools, фактически я использую distribute. Еще один урок: при установке моего собственного пакета из pypi и планировании разработки другого, локально использующего то же пространство имен, не используйте $ pip install <the package> , не используйте $ easy_install <the package>, иначе вы столкнетесь с конфликтами при импорте вашего пакета разработки.
Ян Влчинский
1
Чтобы помочь другим: потому что я не root, я все устанавливаю у себя дома. Вот что я сделал easy_install --user --prefix=$HOME pip. Затем я добавил следующее в моих PATH: ln -s /home/tflutre/.local/bin/pip ~/bin, ln -s /home/tflutre/.local/bin/pip2.7 ~/binи ln -s /home/tflutre/.local/bin/pip2 ~/bin.
tflutre
3
Это должен быть принятый ответ, так как он намного проще, и pip обычно все равно поставляется с Python. Это просто использовать в командной строке / терминале - pip uninstall moduleили python -m pip uninstall moduleдолжно работать. Также должен быть кроссплатформенным, так как является частью Python.
Эдвард
81

Ответ № 1 имеет проблемы:

  • Не будет работать на Mac.
  • Если установлен файл с пробелами или другими специальными символами, xargsкоманда не выполнится и удалит все файлы / каталоги, которые соответствуют отдельным словам.
  • -rв rm -rfненужно и в худшем случае может удалить вещи , которые вы не хотите.

Вместо этого для unix-like:

sudo python setup.py install --record files.txt
# inspect files.txt to make sure it looks ok. Then:
tr '\n' '\0' < files.txt | xargs -0 sudo rm -f --

И для окон:

python setup.py bdist_wininst
dist/foo-1.0.win32.exe

Есть также неразрешимые проблемы с удалением setup.pyустановки, которые не будут беспокоить вас в типичном случае. Для более полного ответа, смотрите эту вики-страницу:

https://ofswiki.org/wiki/Uninstalling_setup.py_install

Ян Келлинг
источник
3
Почему вы просто не оставляете предложение под одобренным? Обратите внимание, что эти "серьезные проблемы" касаются самых важных случаев.
lpapp
17
Я оставил комментарий под проголосовавшим. Мой комментарий похоронен по ссылке «загрузить больше комментариев», по которой мало кто нажимает. Я также сделал свой собственный ответ, потому что у меня было намного больше, чтобы сказать, т.е. ссылка в моем ответе. Кроме того, угловой случай не будет первым термином, который приходит мне в голову, когда в файле есть пробел.
Ян Келлинг
Что бы это ни стоило, я думаю, что это потерпит неудачу на именах файлов, которые содержат переводы строк :) Являются ли какие-либо сопровождающие пакетов таким злом, надеюсь, я никогда не узнаю.
Джек О'Коннор
2
В OS X Mavericks, по крайней мере, xargs не имеет опции -d. Почему? Потому что Apple любит тебя. В любом случае это имеет те же эффекты, что и выше, и безопасно с пробелами и тому подобным. Хотя это специфично для Bash. После запуска установки с помощью --record to files.txt:OIFS=$IFS; IFS=$'\n'; FILES=( $( cat files.txt ) ); IFS=$OIFS; sudo rm -rf "${FILES[@]}"
Джозеф Сикорски
2
@IanKelling Внедрение переменных внутри printfстроки формата не удастся, если строка содержит, например, символы %или \. Всегда предоставляйте строку формата: printf '%s\0' "$line"(также избегает эхо). Хотя вы можете избежать цикла, просто используяtr '\n' '\0' < files.txt | xargs -0 rm -f
geirha
39

Сначала запишите файлы, которые вы установили. Вы можете повторить эту команду, даже если вы ранее выполняли setup.py install:

python setup.py install --record files.txt

Когда вы хотите удалить, вы можете просто:

sudo rm $(cat files.txt)

Это работает, потому что команда rm берет разделенный пробелами список файлов для удаления, и ваша установочная запись является именно таким списком.

Натан
источник
Есть ли способ проверить не только то, установила ли это моя программа, но и если с тех пор ни одно другое приложение не использовало этот ресурс? Например, я установил инструмент, для этого мне пришлось установить несколько библиотек, возможно, некоторые из них уже были установлены (что означает, что я не могу удалить в процессе удаления), но также я не могу удалить ничего, что другие приложения не был установлен, потому что моя библиотека была установлена ​​первой ...
Габриель,
19

Теперь Python дает вам возможность установить pipво время установки (я на Windows, и, по крайней мере, Python делает для Windows!). Учитывая, что вы выбрали установку pipво время установки python (вам на самом деле не нужно выбирать, потому что это по умолчанию), pipон уже установлен для вас. Затем введите в pipкомандной строке, вы должны увидеть помощь. Вы можете найти необходимые инструкции по использованию там. Например, pip listпоказывает список установленных пакетов. Ты можешь использовать

pip uninstall package_name

удалить любой пакет, который вам больше не нужен. Подробнее читайте здесь (документация по пунктам) .

Sнаđошƒаӽ
источник
8

Ленивый способ: просто удалите из меню установки Windows (если вы используете Windows) или из команды rpm, при условии, что вы сначала переустановите его после создания дистрибутива.

Например,

python setup.py bdist_wininst
dist/foo-1.0.win32.exe

(«foo» является примером, конечно).

RedGlyph
источник
4
Я не знаю, нравится ли мне это, но вы получаете точку для ортогонального мышления. :)
Леннарт Регебро
Если честно, я тоже не уверен, следовательно, «ленивый путь» ;-) Но я подумал, что упомяну, что можно создать более «стандартный» установщик. Странно, но setup.py не предоставляет чистого способа удаления пакетов.
RedGlyph
1
Для удаления требуется централизованная регистрация установленных пакетов и их файлов, а их нет. Продолжаются дискуссии о том, как улучшить эту историю, и она может быть решена в Python 2.7 / 3.2 или 2.8 / 3.3 или около того.
Леннарт Регебро
1
@Lennart: не будет Python 2.8, по крайней мере, это текущее официальное заявление
Петр Овсяк
2
@PiotrOwsiak: Да, но тогда это не было утверждением. 2.8 все еще оставалось возможным в то время и оставалось таковым до одобрения PEP 404, я думаю, в конце прошлого года.
Леннарт Регебро
6

Перейдите в каталог с пакетом python и удалите файл .egg, например: В python 2.5 (ubuntu): /usr/lib/python2.5/site-packages/

В Python 2.6 (Ubuntu): /usr/local/lib/python2.6/dist-packages/

user149513
источник
1
Работает, если только не устанавливать установленные файлы вне пакета, что делают некоторые, например, setuptools, который устанавливает, и команда easy_install.
Леннарт Регебро
3
Обычно, если пакет был установлен с использованием python setup.py, как указано в OP, яйцо не будет. OTOH, если он есть, потому что использовался easy_install, документированный способ удаления пакетов заключается в использовании easy_install -m перед удалением файла egg; в противном случае скорлупа яиц может остаться в файле easy-install.pth.
Нед Дейли
5

Не совсем отвечая на вопрос, но помогая мне каждый день:

Установите ваши пакеты с

pip install .

Это помещает пакет в $HOME/.local. Удалить с помощью

pip uninstall <package_name>
Нико Шлёмер
источник
1
pip unistall .не работал для меня, но pip uninstall <package_name>сделал, спасибо!
Даниэль
4

Вероятно, вы можете сделать это в качестве альтернативы: -

1) Получить версию Python -

[linux machine]# python
Python 2.4.3 (#1, Jun 18 2012, 14:38:55) 

-> Приведенная выше команда дает вам текущую версию Python, которая является 2.4.3

2) Получить каталог установки Python -

[linux machine]# whereis python
python: /usr/bin/python /usr/bin/python2.4 /usr/lib/python2.4 /usr/local/bin/python2.5 /usr/include/python2.4 /usr/share/man/man1/python.1.gz

-> С помощью приведенной выше команды вы можете получить каталог установки - /usr/lib/python2.4/site-packages

3) Отсюда вы можете удалить пакеты и файлы python egg

[linux machine]# cd /usr/lib/python2.4/site-packages
[linux machine]# rm -rf paramiko-1.12.0-py2.4.egg paramiko-1.7.7.1-py2.4.egg paramiko-1.9.0-py2.4.egg

Это сработало для меня .. И я смог удалить пакет, который беспокоил меня :)

COD3R
источник
3

Я думаю, что вы можете открыть setup.py, найти имя пакета, а затем попросить pip удалить его.

Предполагая, что имя доступно в переменной 'METADATA':

pip uninstall $(python -c "from setup import METADATA; print METADATA['name']")
ThorSummoner
источник
1

Продолжая сказанное Мартином, запись выходных данных установки и небольшой сценарий bash делают свое дело довольно хорошо. Вот что я делаю ...

for i in $(less install.record);
sudo rm $i;
done;

И престо. Ый.

сибас
источник
2
Гораздо проще написать это как sudo xargs rm -v < install.record.
пул
1

Если у вас все еще есть файлы, которые должны быть удалены после переустановки пакета, убедитесь, что папка buildтакже удалена. Поэтому, предполагая, что pkgэто пакет, который вы хотите удалить:

rm -r $(python3 -c "import pkg; print(pkg.__path__[0] + '*' )") 
rm -rf build

Работайте над python3 и удалите пакет и его файл * .egg-info.

Улисес Росас-Пучури
источник
1

В {virtualenv}/lib/python2.7/site-packages/(если не использовать virtualenv, то {system_dir}/lib/python2.7/dist-packages/)

  • Удалить файл яйца (например distribute-0.6.34-py2.7.egg)
  • Если есть что-либо из файла easy-install.pth, удалите соответствующую строку (это должен быть путь к исходному каталогу или к файлу яйца).
Bhindi
источник
0

В какой-то момент в прошлом я случайно запускал «python setup.py install» в своей глобальной среде, и мне было очень трудно удалить его. Эти решения не помогли. «pip uninstall» не работал с «Не могу удалить« splunk-appinspect ». Не найдено файлов для удаления». msgstr "sudo pip uninstall" не работает "Невозможно удалить требование. spunk-appinspect, не установлено". Я попытался удалить pip, удалить кэш pip, найти пакет на моем жестком диске и т. Д.

«pip show» в конечном итоге привело меня к решению, «Location:» указывало на каталог, а переименование этого каталога привело к удалению упакованного из списка pip. Я переименовал каталог обратно, и он не появился в списке pip, и теперь я могу переустановить свой пакет в virtualenv.

mmacvicar
источник
0

Я запустил python setup.py installодин раз в моем PyCharm, он устанавливает все пакеты в моей базовой среде conda. Позже, когда я хочу удалить все эти пакеты, pip uninstallне работает. Мне пришлось удалить их из /anaconda3/lib/python3.7/site-packages вручную :(

Поэтому я не вижу причины, по которой они используют файл setup.py вместо записи файла needs.txt. Файл требований может использоваться для установки пакетов в виртуальной среде и не будет связываться с пакетами системного Python.

Yossarian42
источник
-1

Возможно, было бы лучше удалить связанные файлы, используя bash для чтения команд, например:

sudo python setup.py install --record files.txt
sudo bash -c "cat files.txt | xargs rm -rf"
Марк Пэн
источник
Это копия существующего ранее ответа.
Карл Рихтер