Qual è il modo più semplice per rimuovere tutti i pacchetti installati da pip?


616

Sto cercando di sistemare una delle mie virtual virtual: vorrei ripristinare tutte le librerie installate su quelle che corrispondono alla produzione.

C'è un modo semplice e veloce per farlo con pip?


10
@patelshahrukh disinstallando python NON rimuove i pacchetti pip. per favore, EVITATI di farlo, poiché molto probabilmente NON FUNZIONA nel modo in cui pensi che funzionerà e , a seconda di come installi nuovamente Python, può lasciare il tuo computer in uno stato instabile che richiede più lavoro da risolvere .
blueberryfields

questo potrebbe aiutare per i pacchetti installati in modalità di sviluppo o in modalità modificabile: stackoverflow.com/questions/17346619/…
Charlie Parker

Risposte:


925

Ho trovato questo frammento come soluzione alternativa. È una rimozione più graziosa delle librerie rispetto al rifacimento di virtualenv:

pip freeze | xargs pip uninstall -y

Nel caso in cui i pacchetti siano installati tramite VCS, è necessario escludere tali righe e rimuovere i pacchetti manualmente (elevato dai commenti seguenti):

pip freeze | grep -v "^-e" | xargs pip uninstall -y

4
Trovo che questa sia una buona soluzione, semplicemente perché non rimuove completamente l'ambiente virtuale - potrei aver apportato modifiche, ad esempio, postactivateche rimarranno.
niceguydave,

5
Dopo aver eseguito questo mi sono reso conto che ha rimosso il setuptoolspacchetto. Ho risolto il problema seguendo le istruzioni qui: stackoverflow.com/questions/7446187/…
Dan

1
@ gerty3000 sì, questo (come richiesto dalla domanda) rimuoverà tutti i pacchetti installati in un virtual-env. nel tuo ambiente, forse setuptools sarebbe meglio installato in una posizione globale invece?
Blueberryfields,

7
Puoi anche usare pip freeze --exclude-editable | xargs pip uninstall -yper ignorare i pacchetti VCS senza usare un modello grep
Connor Brinton,

2
E per disinstallare i pacchetti modificabili consultare stackoverflow.com/questions/17346619
Dan Oak,

318

Funzionerà con tutti i sistemi Mac, Windows e Linux. Per ottenere l'elenco di tutti i pacchetti pip nel file Requisito.txt (Nota: questo sovrascriverà Requisit.txt se esiste altrimenti creerà il nuovo, anche se non si desidera sostituire il vecchio fabbisogno.txt quindi assegnare un nome file diverso nel seguente comando al posto Requisiti.txt).

pip freeze > requirements.txt

Ora per rimuovere uno per uno

pip uninstall -r requirements.txt

Se vogliamo rimuovere tutto in una volta, allora

pip uninstall -r requirements.txt -y

Se stai lavorando a un progetto esistente che ha un requirements.txtfile e il tuo ambiente è divergente, sostituisci semplicemente requirements.txtdagli esempi precedenti con toberemoved.txt. Quindi, dopo aver eseguito i passaggi precedenti, è possibile utilizzare il requirements.txtper aggiornare l'ambiente ora pulito.

E per singolo comando senza creare alcun file (come suggerito da @joeb).

pip uninstall -y -r <(pip freeze)

11
probabilmente vale la pena ricordare che si sta forzando la sovrascrittura del loro file requisito.txt, nel caso in cui non lo sapessero. :)
Dave Gregory,

4
Inoltre, se si desidera rimuovere tutti i pacchetti, l'aggiunta di "-y" lo farà. Esempio:pip uninstall -r requirements.txt -y
David Metcalfe il

58
Puoi usare pip uninstall -y -r <(pip freeze)per fare tutto in una volta sola.
Joeb,

1
@joeb sì, possiamo fare anche così.
Harshad Kavathiya,

1
@HarshadKavathiya puoi usare un altro file per archiviare il congelamento del pip, come "current.txt", in modo da requisit.txt può rimanere allegria incontaminata
NikosKeyz,

118

Funziona con le ultime novità. Penso che sia il modo più breve e dichiarativo per farlo.

virtualenv --clear MYENV

Ma di solito elimino e ricrea solo virtualenv poiché le regole di immutabilità!


7
È effettivamente lo stesso di correre wipeenv? virtualenvwrapper.readthedocs.org/en/latest/…
Taylor Edmiston

In realtà - sembra (da quello che ho appena incontrato) mentre wipeenvmentre nell'ambiente genera un errore e non rimuove nulla se utilizzato nel contesto di una pip install -ebuild di sviluppo, il tentativo di utilizzare virtualenv --clear MYENVnon genera un errore e non rimuove nessuno dei pacchetti che potresti aver installato in precedenza nell'ambiente. Almeno questo è il caso di OSX. Vedi bitbucket.org/dhellmann/virtualenvwrapper/issues/211/… per ulteriori informazioni.
mpacer,

2
wipeenvè un alias fornito da virtualenvwrapper, quindi non tutti ce l'hanno.
Jonathan Hartley,

2
bene, questo è un po 'un trucco sporco, ma funziona come per magia. Preferirei che tutti usassero la disinstallazione pip -r Requisiti.txt -y. Fa una grande pulizia.
Muema

84

Volevo elevare questa risposta da una sezione di commento perché è una delle soluzioni più eleganti nel thread. Il credito completo per questa risposta va a @joeb .

pip uninstall -y -r <(pip freeze)

Questo ha funzionato perfettamente per me nel caso d'uso di svuotare la cartella dei pacchetti utente al di fuori del contesto di un virtualenv che molte delle risposte sopra non gestiscono.

Modifica: Qualcuno sa come far funzionare questo comando in un Makefile?

Bonus: un bash alias

Aggiungo questo al mio profilo bash per comodità:

alias pipuninstallall="pip uninstall -y -r <(pip freeze)"

Quindi eseguire:

pipuninstallall

Alternativa per pipenv

Se ti capita di usare pipenv puoi semplicemente eseguire:

pipenv uninstall --all

8
Dovrebbe essere facilmente il n. 1
Segna

Mi piace ma non funziona nel caso nullo (non pip freezeproduce alcun risultato se non sono installati pacchetti, e pip uninstallpurtroppo si lamenta).
Eric G,

Hmm buona cattura. Forse potrebbe essere racchiuso in una funzione bash che controlla se l'uscita del congelamento del pip non è vuota. Non vedo un ottimo modo per raggiungere questo obiettivo mantenendo il comando un bel one-liner corto.
Taylor Edmiston,

1
make usa sh di default, ma la sintassi di sostituzione <(...)è un bashism. Quindi puoi usare bash -c "..." o aggirare facendo unpip freeze | pip uninstall -r /dev/stdin
Cesare

Non funziona con i notebook di Azure:ERROR: Cannot uninstall 'bitarray'. 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.
SeaDude il

54

Altre risposte che usano pip listo pip freeze devono includere--local altrimenti disinstalla anche i pacchetti che si trovano negli spazi dei nomi comuni.

Ecco quindi lo snippet che uso regolarmente

 pip freeze --local | xargs pip uninstall -y

Rif: pip freeze --help


Buona risposta ... ha funzionato con me
igorkf

Questo ha funzionato fino a quando non ha colpito un pacchetto che ha prodotto questo errore: ERROR: Cannot uninstall 'bitarray'. 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.. Quindi non sono riuscito a disinstallare altri moduli.
SeaDude,

39

Metodo 1 (con pip freeze)

pip freeze | xargs pip uninstall -y

Metodo 2 (con pip list)

pip list | awk '{print $1}' | xargs pip uninstall -y

Metodo 3 (con virtualenv)

virtualenv --clear MYENV

2
sudo non è necessario e molto probabilmente pericoloso da usare senza un'attenta considerazione, poiché influisce sulla configurazione globale della macchina. vedi questa risposta per esempio: stackoverflow.com/questions/15028648/…
blueberryfields

6
Il metodo 2 ( pip list) funziona alla grande fino a quando pip non si disinstalla accidentalmente -_-
Giustino

20

L'ho gestito nel modo seguente:

Creare il file dei requisiti chiamato reqs.txt con l'elenco dei pacchetti attualmente installati

pip freeze > reqs.txt

quindi disinstallare tutti i pacchetti da reqs.txt

pip uninstall \
   -y # remove the package with prompting for confirmation
   -r reqs.txt

Mi piace questo metodo perché hai sempre un file di requisiti pip su cui ripiegare in caso di errore. È anche ripetibile.


Semplice ed elegante, funziona come un incanto
Satyaaditya,

19

Il modo più veloce è di rifare completamente virtualenv. Suppongo che tu abbia un file requisito.txt che corrisponde alla produzione, in caso contrario:

# On production:
pip freeze > reqs.txt

# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt

2
Questo gestisce anche il caso in cui esistesse un'installazione modificabile (sostanzialmente un'installazione in modalità di sviluppo setuptools) che ha creato un file .egg-info locale che ha poi interferito con il resto del processo di installazione / disinstallazione? Dal momento che è un insieme di file, sembra che non sappia come gestirne la presenza, e piuttosto che disinstallare qualsiasi cosa rende una struttura di directory locale sotto MYENV completa di: `> Nuovi eseguibili python in MYENV / bin / python3.4> Anche creazione di file eseguibili in MYENV / bin / python> Installazione di setuptools, pip, wheel ... fatto. Ma MYENV non ha ripristinato l'ambiente!
mpacer,

16

Su Windows se il tuo pathè configurato correttamente, puoi usare:

pip freeze > unins && pip uninstall -y -r unins && del unins

Dovrebbe essere un caso simile per i sistemi simili a Unix:

pip freeze > unins && pip uninstall -y -r unins && rm unins

Solo un avvertimento che questo non è completamente solido in quanto potresti riscontrare problemi come 'File non trovato' ma potrebbe funzionare in alcuni casi comunque

EDIT: per chiarezza: uninsè un file arbitrario che contiene dati scritti quando questo comando esegue:pip freeze > unins

Il file che ha scritto a sua volta viene quindi utilizzato per disinstallare i suddetti pacchetti con consenso implicito / previa approvazione tramite pip uninstall -y -r unins

Il file viene infine eliminato al completamento.



14

Innanzitutto, aggiungi tutto il pacchetto a requirements.txt

pip freeze > requirements.txt

Quindi rimuovere tutto

pip uninstall -y -r requirements.txt 

9

È una vecchia domanda che conosco, ma mi sono imbattuto in esso, quindi per riferimento futuro ora puoi farlo:

pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...

-r, --requiry file

Disinstallare tutti i pacchetti elencati nel file dei requisiti indicato. Questa opzione può essere utilizzata più volte.

dalla documentazione pip versione 8.1


8

Per gli utenti Windows, questo è quello che uso su Windows PowerShell

 pip uninstall -y (pip freeze)

6

(aggiungendo questo come risposta, perché non ho abbastanza reputazione per commentare la risposta di @blueberryfields)

La risposta di @blueberryfields funziona bene, ma non riesce se non è presente alcun pacchetto da disinstallare (il che può essere un problema se questo "disinstalla tutto" fa parte di uno script o di un makefile). Questo può essere risolto xargs -rusando la versione GNU di xargs:

pip freeze --exclude-editable | xargs -r pip uninstall -y

da man xargs:

-r, --no-run-if-empty

Se l'input standard non contiene spazi vuoti, non eseguire il comando. Normalmente, il comando viene eseguito una volta anche se non è presente alcun input. Questa opzione è un'estensione GNU.


6
pip3 freeze --local | xargs pip3 uninstall -y

Il caso potrebbe essere che si debba eseguire questo comando più volte per ottenere uno spazio vuoto pip3 freeze --local.


3

Questo è stato il modo più semplice per me di disinstallare tutti i pacchetti Python.

from pip import get_installed_distributions
from os import system
for i in get_installed_distributions():
    system("pip3 uninstall {} -y -q".format(i.key))

2

Supporto multipiattaforma utilizzando solo pip:

#!/usr/bin/env python

from sys import stderr
from pip.commands.uninstall import UninstallCommand
from pip import get_installed_distributions

pip_uninstall = UninstallCommand()
options, args = pip_uninstall.parse_args([
    package.project_name
    for package in
    get_installed_distributions()
    if not package.location.endswith('dist-packages')
])

options.yes = True  # Don't confirm before uninstall
# set `options.require_venv` to True for virtualenv restriction

try:
    print pip_uninstall.run(options, args)
except OSError as e:
    if e.errno != 13:
        raise e
    print >> stderr, "You lack permissions to uninstall this package.
                      Perhaps run with sudo? Exiting."
    exit(13)
# Plenty of other exceptions can be thrown, e.g.: `InstallationError`
# handle them if you want to.

2

Questo è il comando che funziona per me:

pip list | awk '{print $1}' | xargs pip uninstall -y

2

il modo semplice e robusto multipiattaforma e lavorare anche in pipenv è:

pip freeze 
pip uninstall -r requirement

di pipenv:

pipenv run pip freeze 
pipenv run pip uninstall -r requirement

ma non aggiorna piplock o pipfile, quindi fai attenzione


1

Se stai correndo virtualenv:

virtualenv --clear </path/to/your/virtualenv>

per esempio, se il tuo virtualenv è /Users/you/.virtualenvs/projectx, allora avresti eseguito:

virtualenv --clear /Users/you/.virtualenvs/projectx

se non sai dove si trova il tuo env virtuale, puoi eseguire which pythonda un env virtuale attivato per ottenere il percorso


1

Nel mio caso, avevo installato accidentalmente un numero di pacchetti a livello globale usando un Homebrew installato pipsu macOS. Il modo più semplice per ripristinare i pacchetti predefiniti era un semplice:

$ brew reinstall python

Oppure, se stavi usando pip3:

$ brew reinstall python3

Questa risposta presuppone troppo sull'ambiente e non risolve direttamente il problema se si utilizza pyenv per esempio.
Segna il

@Mark Bene, se stai usando pyenv, allora dovresti fare qualcosa di diverso. Nel caso comune in cui non lo sei, credo che questa sia la soluzione più semplice e meno confusa. Si noti che questa condizione è esplicitamente dichiarata all'inizio della risposta.
Radon Rosborough,

L'OP ha chiesto informazioni su virtualenvs. Non ha menzionato in modo specifico l'uso di un Mac o di una birra per installare Python. Pertanto non puoi presumere che sia stato utilizzato il sistema operativo o la birra - e questa risposta non risolverà TUTTE le condizioni. Se ti concentri sulla risoluzione per l'ambiente utilizzando uno strumento come pip, affronterai il contesto dell'ambiente in cui ti trovi. Spero che abbia un senso.
Segna il

1
@Mark Capisco la tua posizione. Possiamo convenire che non concordiamo. Voglio solo aiutare le persone di Google che fanno clic su un link con l'etichetta "Qual è il modo più semplice per rimuovere tutti i pacchetti installati da pip?" quando vogliono veramente rimuovere tutti i pacchetti installati a livello globale da pip.
Radon Rosborough,

D'accordo con @RadonRosborough, il titolo del link è rappresentativo del motivo per cui sono arrivato qui, anche se l'OP non ha effettivamente posto la stessa domanda.
Kenn Sebesta,

1

In Command Shell di Windows, il comando pip freeze | xargs pip uninstall -ynon funzionerà. Quindi, per quelli di voi che usano Windows, ho trovato un modo alternativo per farlo.

  1. Copia tutti i nomi dei pacchetti installati di pip dal pip freezecomando in un file .txt .
  2. Quindi, vai alla posizione del tuo file .txt ed esegui il comandopip uninstall -r *textfile.txt*


1

Uso l'opzione --user per disinstallare tutti i pacchetti installati nel sito dell'utente.

pip3 freeze --user | disinstallazione di xargs pip3 -y


Credo che questa risposta non aggiunge molte nuove informazioni, avrei preferito suggerito un miglioramento ad un'altra risposta simile già esistente come questo: stackoverflow.com/a/45475070/11138259
sinoroc

-1

Pip non ha modo di sapere quali pacchetti sono stati installati da esso e quali pacchetti sono stati installati dal gestore pacchetti del sistema. Per questo dovresti fare qualcosa del genere

per distribuzioni basate su rpm (sostituisci python2.7 con la tua versione python con cui hai installato pip):

find /usr/lib/python2.7/ |while read f; do
  if ! rpm -qf "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

per una distribuzione basata su deb:

find /usr/lib/python2.7/ |while read f; do
  if ! dpkg-query -S "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

quindi per ripulire le directory vuote rimaste:

find /usr/lib/python2.7 -type d -empty |xargs rm -fr

Ho trovato la risposta migliore molto fuorviante poiché rimuoverà tutti i pacchetti (la maggior parte?) Di Python dalla tua distribuzione e probabilmente ti lascerà con un sistema rotto.


Con tutto il rispetto, questo sembra comparabile. Perché no dpkg-query -S '/usr/lib/python2.7/*', estrarre i nomi e dpkg-query -Logni nome per scaricare i file associati? Ha già preparato i manifest. La mia obiezione principale è che invece di indirizzare i pacchetti installati ovunque tranne che per pip, hai scelto come target pacchetti installati da qualcosa di diverso dal gestore che ti aspetti e in una posizione che pip generalmente non dovrebbe toccare. pip list -lelenca i pacchetti installati localmente e alcuni lo faranno pip install --target=.... La rimozione di tutte le directory attualmente vuote ti morderà anche!
John P,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.