Estoy tratando de arreglar uno de mis virtualenvs: me gustaría restablecer todas las bibliotecas instaladas a las que coinciden con la producción.
¿Hay una manera rápida y fácil de hacer esto con pip?
Estoy tratando de arreglar uno de mis virtualenvs: me gustaría restablecer todas las bibliotecas instaladas a las que coinciden con la producción.
¿Hay una manera rápida y fácil de hacer esto con pip?
Respuestas:
He encontrado este fragmento como una solución alternativa. Es una eliminación más elegante de bibliotecas que rehacer virtualenv:
pip freeze | xargs pip uninstall -y
En caso de que tenga paquetes instalados a través de VCS, debe excluir esas líneas y eliminar los paquetes manualmente (elevado de los comentarios a continuación):
pip freeze | grep -v "^-e" | xargs pip uninstall -y
postactivate
que permanecerán.
setuptools
paquete. Resolví el problema siguiendo las instrucciones aquí: stackoverflow.com/questions/7446187/…
pip freeze --exclude-editable | xargs pip uninstall -y
para ignorar los paquetes de VCS sin usar un patrón grep
Esto funcionará para todos los sistemas Mac, Windows y Linux. Para obtener la lista de todos los paquetes de pip en el archivo require.txt (Nota: esto sobrescribirá a require.txt si existe, creará uno nuevo, también si no desea reemplazar los viejos requisitos.txt, entonces asigne un nombre de archivo diferente en todos los siguientes comandos en el lugar requisitos.txt).
pip freeze > requirements.txt
Ahora para eliminar uno por uno
pip uninstall -r requirements.txt
Si queremos eliminar todo de una vez, entonces
pip uninstall -r requirements.txt -y
Si está trabajando en un proyecto existente que tiene un requirements.txt
archivo y su entorno ha divergido, simplemente reemplace requirements.txt
de los ejemplos anteriores con toberemoved.txt
. Luego, una vez que haya seguido los pasos anteriores, puede usar requirements.txt
para actualizar su entorno ahora limpio.
Y para un solo comando sin crear ningún archivo (como sugirió @joeb).
pip uninstall -y -r <(pip freeze)
pip uninstall -r requirements.txt -y
pip uninstall -y -r <(pip freeze)
para hacer todo de una vez.
Esto funciona con lo último. Creo que es la forma más corta y declarativa de hacerlo.
virtualenv --clear MYENV
¡Pero generalmente solo borro y recreo el virtualenv ya que las reglas de inmutabilidad!
wipeenv
? virtualenvwrapper.readthedocs.org/en/latest/…
wipeenv
que dentro del entorno arroja un error y no elimina nada si se usa en el contexto de una pip install -e
compilación de desarrollo, intentar usar virtualenv --clear MYENV
no arroja un error y no elimina ninguno de los paquetes que puede haber instalado previamente en el entorno. Al menos este es el caso en OSX. Ver bitbucket.org/dhellmann/virtualenvwrapper/issues/211/… para más información.
wipeenv
es un alias proporcionado por virtualenvwrapper, por lo que no todos lo tienen.
Quería elevar esta respuesta de una sección de comentarios porque es una de las soluciones más elegantes del hilo. El crédito completo por esta respuesta va a @joeb .
pip uninstall -y -r <(pip freeze)
Esto funcionó muy bien para mí para el caso de uso de borrar mi carpeta de paquetes de usuario fuera del contexto de un virtualenv que muchas de las respuestas anteriores no manejan.
Editar: ¿Alguien sabe cómo hacer que este comando funcione en un Makefile?
Agrego esto a mi perfil de bash por conveniencia:
alias pipuninstallall="pip uninstall -y -r <(pip freeze)"
Entonces corre:
pipuninstallall
Si está utilizando pipenv , puede ejecutar:
pipenv uninstall --all
pip freeze
genera ningún resultado si no hay paquetes instalados y pip uninstall
, lamentablemente, se queja).
<(...)
es un bashism. Entonces puede usar bash -c "...", o trabajar haciendo 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.
Otras respuestas que usan pip list
o pip freeze
deben incluir--local
más también desinstalarán los paquetes que se encuentran en los espacios de nombres comunes.
Así que aquí están los fragmentos que uso regularmente
pip freeze --local | xargs pip uninstall -y
Árbitro: 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.
. Entonces no pude desinstalar más módulos.
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
) funciona muy bien hasta que pip se desinstale accidentalmente a sí mismo -_-
Lo logré haciendo lo siguiente:
Cree el archivo de requisitos llamado reqs.txt con la lista de paquetes actualmente instalados
pip freeze > reqs.txt
luego desinstale todos los paquetes de reqs.txt
pip uninstall \
-y # remove the package with prompting for confirmation
-r reqs.txt
Me gusta este método, ya que siempre tiene un archivo de requisitos de pip en el que recurrir si comete un error. También es repetible.
La forma más rápida es rehacer el virtualenv por completo. Supongo que tiene un archivo require.txt que coincide con la producción, si no:
# On production:
pip freeze > reqs.txt
# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt
En Windows, si path
está configurado correctamente, puede usar:
pip freeze > unins && pip uninstall -y -r unins && del unins
Debería ser un caso similar para sistemas tipo Unix:
pip freeze > unins && pip uninstall -y -r unins && rm unins
Solo una advertencia de que esto no es completamente sólido, ya que puede encontrarse con problemas como 'Archivo no encontrado', pero puede funcionar en algunos casos
EDITAR: Para mayor claridad: unins
es un archivo arbitrario que tiene datos escritos cuando se ejecuta este comando:pip freeze > unins
Ese archivo que escribió a su vez se usa para desinstalar los paquetes antes mencionados con consentimiento implícito / aprobación previa a través de pip uninstall -y -r unins
El archivo finalmente se elimina al finalizar.
Es una vieja pregunta que conozco, pero me topé con ella, así que para futuras referencias, ahora puede hacer esto:
pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...
-r, --archivo de requisitos
Desinstale todos los paquetes enumerados en el archivo de requisitos dado. Esta opción se puede usar varias veces.
de la documentación de pip versión 8.1
(agregando esto como respuesta, porque no tengo suficiente reputación para comentar sobre la respuesta de @blueberryfields)
La respuesta de @blueberryfields funciona bien, pero falla si no hay un paquete para desinstalar (lo que puede ser un problema si este "desinstalar todo" es parte de un script o archivo MAKE). Esto se puede resolver con xargs -r
la versión de GNU de xargs
:
pip freeze --exclude-editable | xargs -r pip uninstall -y
de man xargs
:
-r, --no-run-if-empty
Si la entrada estándar no contiene espacios en blanco, no ejecute el comando. Normalmente, el comando se ejecuta una vez, incluso si no hay entrada. Esta opción es una extensión GNU.
Esta fue la forma más fácil para mí de desinstalar todos los paquetes de 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))
Soporte multiplataforma utilizando 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.
La manera fácil y robusta multiplataforma y trabajo en pipenv también es:
pip freeze
pip uninstall -r requirement
por pipenv:
pipenv run pip freeze
pipenv run pip uninstall -r requirement
pero no actualizará piplock o pipfile, así que ten en cuenta
Si estás corriendo virtualenv
:
virtualenv --clear </path/to/your/virtualenv>
por ejemplo, si tu virtualenv es /Users/you/.virtualenvs/projectx
, entonces ejecutarías:
virtualenv --clear /Users/you/.virtualenvs/projectx
si no sabe dónde se encuentra su entorno virtual, puede ejecutarlo which python
desde un entorno virtual activado para obtener la ruta
En mi caso, accidentalmente instalé varios paquetes a nivel mundial utilizando un Homebrew instalado pip
en macOS. La forma más fácil de volver a los paquetes predeterminados fue simple:
$ brew reinstall python
O, si estuvieras usando pip3
:
$ brew reinstall python3
En Command Shell de Windows, el comando
pip freeze | xargs pip uninstall -y
no funcionará. Entonces, para aquellos de ustedes que usan Windows, he descubierto una forma alternativa de hacerlo.
pip freeze
comando a un archivo .txt .pip uninstall -r *textfile.txt*
Si está usando pew
, puede usar el comando wipeenv :
pew wipeenv [env]
Uso la opción --user para desinstalar todos los paquetes instalados en el sitio del usuario.
pip3 congelar --usuario | xargs pip3 desinstalar -y
Pip no tiene forma de saber qué paquetes fueron instalados por él y qué paquetes fueron instalados por el administrador de paquetes de su sistema. Para esto necesitarías hacer algo como esto
para distribuciones basadas en rpm (reemplace python2.7 con su versión de python con la que instaló pip):
find /usr/lib/python2.7/ |while read f; do
if ! rpm -qf "$f" &> /dev/null; then
echo "$f"
fi
done |xargs rm -fr
para una distribución basada en 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
luego para limpiar los directorios vacíos sobrantes:
find /usr/lib/python2.7 -type d -empty |xargs rm -fr
La respuesta principal me pareció muy engañosa, ya que eliminará todos (¿la mayoría?) Los paquetes de Python de su distribución y probablemente lo dejará con un sistema roto.
dpkg-query -S '/usr/lib/python2.7/*'
, extraer los nombres y dpkg-query -L
cada nombre para volcar los archivos asociados? Ya tiene los manifiestos preparados. Mi principal objeción es que, en lugar de apuntar a paquetes instalados en cualquier lugar que no sea pip, ha apuntado paquetes instalados por cualquier otra cosa que no sea el administrador que espera, y en una ubicación que pip generalmente no debería tocar. pip list -l
enumera los paquetes que instaló localmente, y algunos lo harán incluso pip install --target=...
. ¡Eliminar todos los directorios actualmente vacíos también te morderá!