odinstalowanie python setup.py

785

Zainstalowałem pakiet python z python setup.py install.

Jak go odinstalować?

Lecieć jak po sznurku
źródło
52
Przyjęta odpowiedź jest nieaktualna. Zastosowanie pip uninstall <your_package>. Zobacz stackoverflow.com/questions/1231688/... .
Joachim W
21
odinstalowanie pipa nie jest już prawidłową odpowiedzią. Oto dowód. [sri @ localhost python] $ pip uninstall foo DEPRECATION: Deinstalacja zainstalowanego projektu distutils (foo) jest przestarzała i zostanie usunięta w przyszłej wersji. Wynika to z faktu, że odinstalowanie projektu distutils tylko częściowo odinstaluje projekt.
złośnica
@shrewmouse, która już się nie wyświetla.
JC Rocamonde
@JCRocamonde Dzięki pakietowi, który utworzyłem, najnowsza wersja programu pip pokazuje, 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.więc wciąż jest to problem.
Josh
@Josh u góry pliku setup.py robi „z konfiguracji importu setuptools” zamiast „z konfiguracji importu distutils.core”.
bigjake

Odpowiedzi:

976

Uwaga: Unikaj python setup.py installużywaniapip install .

Musisz usunąć wszystkie pliki ręcznie, a także cofnąć wszelkie inne czynności wykonywane ręcznie przez instalację.

Jeśli nie znasz listy wszystkich plików, możesz ją ponownie zainstalować za pomocą tej --recordopcji i rzucić okiem na listę, która się tworzy.

Aby zarejestrować listę zainstalowanych plików, możesz użyć:

python setup.py install --record files.txt

Gdy chcesz odinstalować, możesz użyć xargs do usunięcia:

xargs rm -rf < files.txt

Lub jeśli korzystasz z systemu Windows, użyj Powershell:

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

Następnie usuń także katalog zawierający np /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/my_module-0.1.egg/na macOS. Nie ma plików, ale Python nadal importuje pusty moduł:

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

Po usunięciu Python pokazuje:

>>> import my_module
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'my_module'
Martin v. Löwis
źródło
6
Jeśli to nie zadziała, dodaj sudo w następujący sposób:cat files.txt | xargs sudo rm -rf
saroele
21
Spowoduje to bałagan w plikach ze spacjami. Zobacz moją odpowiedź poniżej: stackoverflow.com/a/25209129/14456
Ian Kelling
1
Jak mogę ponownie zainstalować pakiet, z którego mam kod źródłowy przy użyciu setup.py?
ア レ ッ ク ス
5
Pozostawia to również puste katalogi na ich miejscu.
Dilawar,
3
Cześć, próbowałem twojej sugestii, dla niektórych plików, gdy próbuję cat files.txt | xargs rm -rf mówi, że odmowa dostępu, nawet w trybie sudo, np. dla / usr / local / bin / pydoc lub / usr / local / bin / idle Jakieś pomysły dlaczego?
212

Dla mnie działa głównie:

mieć zainstalowany pip, np .:

$ easy_install pip

Sprawdź, jak nazywa się zainstalowany pakiet z punktu widzenia pip:

$ pip freeze

Spowoduje to wyświetlenie nazw wszystkich pakietów, które zainstalowałeś (i które zostały wykryte przez pip). Nazwa może być czasem długa, a następnie użyj tylko nazwy pakietu wyświetlanej na końcu i po niej #egg=. W większości przypadków możesz również zignorować część wersji (cokolwiek następuje ==lub -).

Następnie odinstaluj pakiet:

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

Jeśli poprosi o potwierdzenie usunięcia paczki, to masz szczęście i zostanie ona usunięta.

pip wykrywa wszystkie pakiety, które zostały zainstalowane przez pip. Powinien także wykryć większość pakietów zainstalowanych przez easy_install lub setup.py, ale w niektórych rzadkich przypadkach może się to nie powieść.

Oto prawdziwa próbka z mojego lokalnego testu z pakietem o nazwie ttr.rdstmcw 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

Edytuj 2015-05-20

Wszystko, co napisano powyżej, nadal obowiązuje, w każdym razie dostępne są teraz niewielkie modyfikacje.

Zainstaluj pip w Pythonie 2.7.9 i Pythonie 3.4

Najnowsze wersje Pythona zawierają pakiet ensurepippozwalający zainstalować pip nawet w trybie offline:

$ python -m surepip --upgrade

W niektórych systemach (takich jak Debian Jessie) jest to niedostępne (aby zapobiec zerwaniu instalacji pythonowego systemu).

Za pomocą greplubfind

W powyższych przykładach założono, że został grepzainstalowany. Miałem (w tym czasie miałem MS Windows na moim komputerze) zainstalowany zestaw narzędzi linuksowych (w tym grep). Alternatywnie użyj natywnego MS Windows findlub po prostu zignoruj ​​to filtrowanie i znajdź nazwę na nieco dłuższej liście wykrytych pakietów python.

Jan Vlcinsky
źródło
1
jakiego narzędzia do pakowania / wersji używasz, aby to działało? ( distutils, distributeitp ...)
Ciro Santilli 4 病毒 审查 六四 事件 法轮功
1
Używam setuptools. Możesz sprawdzić bitbucket.org/vlcinsky/ttr.aws.utils.s3 (co nie jest idealne). W każdym razie jestem niezadowolony z używania pakietów przestrzeni nazw, czasem import jest przerywany bez widocznego powodu. Ale to inna historia.
Jan Vlcinsky
1
poprawianie siebie. Mimo że importuję setuptools, w rzeczywistości używam distribute. Kolejna lekcja: kiedy instaluję własny pakiet z pypi i planuję opracować inny lokalnie współużytkujący tę samą przestrzeń nazw, nie używaj $ pip install <the package> , nie używaj $ easy_install <the package>, w przeciwnym razie podczas importowania pakietu programistycznego wystąpią konflikty.
Jan Vlcinsky
1
Aby pomóc innym: ponieważ nie jestem rootem, instaluję wszystko w moim domu. Oto co zrobiłem easy_install --user --prefix=$HOME pip. Potem dodaje się następujące w moim PATH: ln -s /home/tflutre/.local/bin/pip ~/bin, ln -s /home/tflutre/.local/bin/pip2.7 ~/bini ln -s /home/tflutre/.local/bin/pip2 ~/bin.
tflutre
3
Należy zaakceptować odpowiedź, ponieważ jest to o wiele łatwiejsze, a pip zwykle i tak jest dostarczany z Pythonem. Jest prosty w użyciu w wierszu polecenia / terminalu - pip uninstall modulelub python -m pip uninstall modulepowinien działać. Powinien również być wieloplatformowy, podobnie jak część Pythona.
Edward
81

Odpowiedź nr 1 ma problemy:

  • Nie działa na komputerze Mac.
  • Jeśli zainstalowany jest plik zawierający spacje lub inne znaki specjalne, xargspolecenie zakończy się niepowodzeniem i usunie wszystkie pliki / katalogi pasujące do poszczególnych słów.
  • -rw rm -rfto niepotrzebne, aw najgorszym mogło usunąć rzeczy, których nie chcę.

Zamiast tego, dla systemu uniksowego:

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 --

A dla Windows:

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

Istnieją również nierozwiązywalne problemy z odinstalowaniem setup.pyinstalacji, które nie przeszkadzają w typowym przypadku. Aby uzyskać bardziej kompletną odpowiedź, zobacz tę stronę wiki:

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

Ian Kelling
źródło
3
Dlaczego po prostu nie zostawiasz sugestii pod oceną? Należy pamiętać, że te „poważne problemy” dotyczą spraw narożnych.
lpapp,
17
Zostawiłem komentarz pod tym ocenionym. Mój komentarz jest ukryty pod linkiem „ładuj więcej komentarzy”, który klikają bardzo niewiele osób. Udzieliłem również własnej odpowiedzi, ponieważ miałem dużo więcej do powiedzenia, tj. link w mojej odpowiedzi. Również przypadek narożny nie byłby pierwszym terminem, który przychodzi mi do głowy, gdy w pliku jest spacja.
Ian Kelling
Jeśli chodzi o wartość, myślę, że to zawiedzie w przypadku nazw plików zawierających nowe wiersze :) Niezależnie od tego, czy opiekunowie pakietów są tak źli, mam nadzieję, że nigdy się nie dowiem.
Jack O'Connor,
2
W OS X Mavericks przynajmniej xargs nie ma opcji -d. Dlaczego? Ponieważ Apple cię kocha. W każdym razie ma to takie same efekty, jak powyżej, i jest bezpieczne dla przestrzeni i tym podobnych. Jest to jednak specyficzne dla Bash. Po uruchomieniu instalacji z opcją --record to files.txt:OIFS=$IFS; IFS=$'\n'; FILES=( $( cat files.txt ) ); IFS=$OIFS; sudo rm -rf "${FILES[@]}"
Joseph Sikorski
2
@IanKelling Osadzanie zmiennych w printfłańcuchu formatu nie powiedzie się, jeśli łańcuch zawiera np . Znaki %lub \. Zawsze podawaj ciąg formatu: printf '%s\0' "$line"(unika także echa). Chociaż możesz dodatkowo ominąć pętlę, używająctr '\n' '\0' < files.txt | xargs -0 rm -f
geirha,
39

Najpierw nagraj zainstalowane pliki. Możesz powtórzyć to polecenie, nawet jeśli wcześniej uruchomiłeś setup.py install:

python setup.py install --record files.txt

Kiedy chcesz odinstalować, możesz po prostu:

sudo rm $(cat files.txt)

Działa to, ponieważ polecenie rm usuwa listę plików oddzieloną spacjami, a rekord instalacji jest taką listą.

Natan
źródło
Czy istnieje sposób, aby sprawdzić nie tylko, czy to mój program go zainstalował, ale także czy od tego czasu żadna inna aplikacja nie używała tego zasobu? Na przykład zainstalowałem narzędzie, aby to zrobić, musiałem zainstalować kilka bibliotek, być może niektóre z nich zostały już zainstalowane (co oznacza, że ​​nie mogę usunąć w procesie odinstalowywania), ale także nie mogę usunąć niczego, co inne aplikacje nie zainstalowałem, ponieważ moja biblioteka zainstalowała się pierwsza ...
Gabrielle
19

Teraz python daje wybór do instalacji pippodczas instalacji (jestem w systemie Windows, a przynajmniej python robi to w przypadku systemu Windows!). Biorąc pod uwagę, że zdecydowałeś się zainstalować pippodczas instalacji Pythona (tak naprawdę nie musisz wybierać, ponieważ jest on domyślny), pipjest już dla Ciebie zainstalowany. Następnie wpisz w pipwierszu polecenia, powinna pojawić się pomoc. Znajdziesz tam niezbędne instrukcje użytkowania. Np. pip listPokazuje listę zainstalowanych pakietów. Możesz użyć

pip uninstall package_name

odinstalować dowolny pakiet, którego już nie chcesz. Przeczytaj więcej tutaj (dokumentacja pip) .

Sнаđошƒаӽ
źródło
8

Leniwy sposób: po prostu odinstaluj z menu instalacji systemu Windows (jeśli używasz systemu Windows) lub z polecenia rpm, pod warunkiem, że najpierw go ponownie zainstalujesz po utworzeniu pakietu dystrybucyjnego.

Na przykład,

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

(„foo” jest oczywiście przykładem).

RedGlyph
źródło
4
Nie wiem, czy mi się podoba, ale masz rację dla myślenia ortogalicznego. :)
Lennart Regebro,
Szczerze mówiąc, nie jestem pewien, czy stąd „leniwy sposób” ;-) Ale pomyślałem, że wspomnę, że można było stworzyć bardziej „standardowy” instalator. Dziwne, że setup.py nie zapewnia jednak czystego sposobu usuwania pakietów.
RedGlyph,
1
Odinstalowanie wymaga scentralizowanych rejestrów zainstalowanych pakietów i jego plików, a nie ma takiego. Trwają dyskusje na temat ulepszenia tej historii, którą można rozwiązać w Pythonie 2.7 / 3.2 lub 2.8 / 3.3.
Lennart Regebro,
1
@ Lennart: nie będzie Python 2.8, przynajmniej takie jest obecne oficjalne oświadczenie
Piotr Owsiak,
2
@PiotrOwsiak: Tak, ale wtedy nie było to stwierdzenie. 2.8 było w tym czasie nadal możliwe i tak było do momentu zatwierdzenia PEP 404, chyba pod koniec zeszłego roku.
Lennart Regebro,
6

Przejdź do katalogu pakietu python i usuń plik .egg, np .: In python 2.5 (ubuntu): /usr/lib/python2.5/site-packages/

W python 2.6 (ubuntu): /usr/local/lib/python2.6/dist-packages/

użytkownik149513
źródło
1
Działa, chyba że instaluje zainstalowane pliki poza pakietem, co niektórzy robią, np. Setuptools, który instaluje i polecenie easy_install.
Lennart Regebro
3
Normalnie, jeśli pakiet zostałby zainstalowany przy użyciu pliku pyt.i setup.py zgodnie z opcją, nie byłoby jajka. OTOH, jeśli istnieje, ponieważ użyto easy_install, udokumentowanym sposobem odinstalowania pakietów jest użycie easy_install -m przed usunięciem pliku jaja; w przeciwnym razie skorupy jaj mogą pozostać w pliku easy-install.pth.
Ned Deily,
5

Nie do końca odpowiadam na pytanie, ale coś, co pomaga mi na co dzień:

Zainstaluj swoje pakiety za pomocą

pip install .

To umieszcza pakiet $HOME/.local. Odinstaluj za pomocą

pip uninstall <package_name>
Nico Schlömer
źródło
1
pip unistall .nie działało dla mnie, ale działało pip uninstall <package_name>, dzięki!
Danijel
4

Prawdopodobnie możesz to zrobić jako alternatywę:

1) Pobierz wersję python -

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

-> Powyższe polecenie podaje aktualną wersję Pythona, czyli 2.4.3

2) Pobierz katalog instalacyjny Pythona -

[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

-> Z powyższego polecenia można uzyskać katalog instalacyjny - /usr/lib/python2.4/site-packages

3) Stąd możesz usunąć pakiety i pliki jajek Pythona

[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

To działało dla mnie .. I udało mi się odinstalować pakiet, który mnie niepokoił :)

COD3R
źródło
3

Myślę, że możesz otworzyć plik setup.py, zlokalizować nazwę pakietu, a następnie poprosić pip o odinstalowanie.

Zakładając, że nazwa jest dostępna w zmiennej „METADATA”:

pip uninstall $(python -c "from setup import METADATA; print METADATA['name']")
ThorSummoner
źródło
1

Rozszerzając to, co powiedział Martin, nagrywanie danych wyjściowych instalacji i trochę skryptów bash robi całkiem nieźle. Oto co robię ...

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

I presto. Odinstalowano

labraksa
źródło
2
Znacznie łatwiej jest napisać to jako sudo xargs rm -v < install.record.
poolie
1

Jeśli nadal masz pliki, które powinny zostać usunięte po ponownej instalacji pakietu, upewnij się, że folder buildrównież został usunięty. Dlatego zakładając, że pkgjest to pakiet, który chcesz usunąć:

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

Przestań ćwiczyć dla Python3 i usuń pakiet oraz jego plik * .egg-info

Ulises Rosas-Puchuri
źródło
1

At {virtualenv}/lib/python2.7/site-packages/(jeśli nie używasz virtualenv, to {system_dir}/lib/python2.7/dist-packages/)

  • Usuń plik jaja (np. distribute-0.6.34-py2.7.egg)
  • Jeśli jest coś z pliku easy-install.pth, usuń odpowiedni wiersz (powinna to być ścieżka do katalogu źródłowego lub pliku jaja).
Bhindi
źródło
0

W pewnym momencie w przeszłości w moim globalnym środowisku uruchomiłem „python setup.py install” i miałem duże trudności z odinstalowaniem. Te rozwiązania nie pomogły. „Odinstaluj pip” nie działał z „Nie można odinstalować„ splunk-appinspect ”. Nie znaleziono plików do odinstalowania”. „odinstalowanie sudo pip” nie działało „Nie można odinstalować wymagania splunk-appinspect, niezainstalowany”. Próbowałem odinstalować pip, usunąć pamięć podręczną pip, przeszukać pakiet na dysku twardym itp.

„pip show” ostatecznie doprowadziło mnie do rozwiązania, „Lokalizacja:” wskazywało na katalog, a zmiana nazwy tego katalogu spowodowała usunięcie pakietu z listy pip. Zmieniłem nazwę katalogu z powrotem i nie pojawił się ponownie na liście pip, a teraz mogę ponownie zainstalować mój pakiet w virtualenv.

mmacvicar
źródło
0

python setup.py installRaz uruchomiłem w PyCharm, instaluje wszystkie pakiety w moim podstawowym środowisku conda. Później, gdy chcę usunąć wszystkie te pakiety, pip uninstallnie działa. Musiałem je ręcznie usunąć z /anaconda3/lib/python3.7/site-packages :(

Nie widzę więc powodu, dla którego używają pliku setup.py zamiast pisać plik wymagania.txt. Plik wymagań może służyć do instalowania pakietów w środowisku wirtualnym i nie będzie bałaganu w pakietach Pythona.

Yossarian42
źródło
-1

Lepszym rozwiązaniem może być usunięcie powiązanych plików za pomocą bash do odczytu poleceń, takich jak:

sudo python setup.py install --record files.txt
sudo bash -c "cat files.txt | xargs rm -rf"
Mark Peng
źródło
To jest kopia istniejącej wcześniejszej odpowiedzi.
Karl Richter