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?
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?
Risposte:
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
postactivate
che rimarranno.
setuptools
pacchetto. Ho risolto il problema seguendo le istruzioni qui: stackoverflow.com/questions/7446187/…
pip freeze --exclude-editable | xargs pip uninstall -y
per ignorare i pacchetti VCS senza usare un modello grep
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.txt
file e il tuo ambiente è divergente, sostituisci semplicemente requirements.txt
dagli esempi precedenti con toberemoved.txt
. Quindi, dopo aver eseguito i passaggi precedenti, è possibile utilizzare il requirements.txt
per aggiornare l'ambiente ora pulito.
E per singolo comando senza creare alcun file (come suggerito da @joeb).
pip uninstall -y -r <(pip freeze)
pip uninstall -r requirements.txt -y
pip uninstall -y -r <(pip freeze)
per fare tutto in una volta sola.
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à!
wipeenv
? virtualenvwrapper.readthedocs.org/en/latest/…
wipeenv
mentre nell'ambiente genera un errore e non rimuove nulla se utilizzato nel contesto di una pip install -e
build di sviluppo, il tentativo di utilizzare virtualenv --clear MYENV
non 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.
wipeenv
è un alias fornito da virtualenvwrapper, quindi non tutti ce l'hanno.
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?
Aggiungo questo al mio profilo bash per comodità:
alias pipuninstallall="pip uninstall -y -r <(pip freeze)"
Quindi eseguire:
pipuninstallall
Se ti capita di usare pipenv puoi semplicemente eseguire:
pipenv uninstall --all
pip freeze
produce alcun risultato se non sono installati pacchetti, e pip uninstall
purtroppo si lamenta).
<(...)
è un bashism. Quindi puoi usare bash -c "..." o aggirare facendo unpip freeze | pip uninstall -r /dev/stdin
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.
Altre risposte che usano pip list
o 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
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.
pip freeze
)pip freeze | xargs pip uninstall -y
pip list
)pip list | awk '{print $1}' | xargs pip uninstall -y
virtualenv
)virtualenv --clear MYENV
pip list
) funziona alla grande fino a quando pip non si disinstalla accidentalmente -_-
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.
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
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.
È 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
(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 -r
usando 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.
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))
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.
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
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 python
da un env virtuale attivato per ottenere il percorso
Nel mio caso, avevo installato accidentalmente un numero di pacchetti a livello globale usando un Homebrew installato pip
su macOS. Il modo più semplice per ripristinare i pacchetti predefiniti era un semplice:
$ brew reinstall python
Oppure, se stavi usando pip3
:
$ brew reinstall python3
In Command Shell di Windows, il comando
pip freeze | xargs pip uninstall -y
non funzionerà. Quindi, per quelli di voi che usano Windows, ho trovato un modo alternativo per farlo.
pip freeze
comando in un file .txt .pip uninstall -r *textfile.txt*
Se stai usando pew
, puoi usare il comando wipeenv :
pew wipeenv [env]
Uso l'opzione --user per disinstallare tutti i pacchetti installati nel sito dell'utente.
pip3 freeze --user | disinstallazione di xargs pip3 -y
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.
dpkg-query -S '/usr/lib/python2.7/*'
, estrarre i nomi e dpkg-query -L
ogni 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 -l
elenca i pacchetti installati localmente e alcuni lo faranno pip install --target=...
. La rimozione di tutte le directory attualmente vuote ti morderà anche!