¿La desinstalación de un paquete con "pip" también elimina los paquetes dependientes?

153

Cuando utiliza pippara instalar un paquete, todos los paquetes necesarios también se instalarán con él (dependencias). ¿La desinstalación de ese paquete también elimina los paquetes dependientes?

Hossein
fuente
1
¿Por qué no puedes probarlo y ver? Haría exactamente eso para responder a su pregunta, pero por alguna razón pip no puede obtener el índice del paquete aquí en este momento.
Thomas Vander Stichele
1
He encontrado en pip newsgroup que las personas pip no quieren esta funcionalidad, al menos por ahora. ¡Que pena!
Michel Samia
44
@ThomasVanderStichele porque la respuesta no estaría disponible en línea para futuros Googlers :)
Marque el
1
@Mark sería, solo escriba la respuesta a su propia pregunta aquí.
Thomas Vander Stichele
55
@ThomasVanderStichele: no soy el OP, pero he aquí por qué esta es una pregunta y respuesta muy legítima para SO: pipes a) notoriamente frágil y dependiente de la versión, también b) en algunas instalaciones de clientes con las que tuve que trabajar, se instaló con derechos de administrador (aunque los paquetes no lo eran), por lo tanto, romperlo o desinstalarlo fue una pena enorme y tuvo una oportunidad para hacerlo bien. c) la conectividad a internet puede no ser excelente; Por razones de seguridad, las máquinas corporativas a menudo tienen un cortafuegos, por lo que no puede asumir la conectividad directa, y debe saber de antemano todo lo que necesitará y su versión, y descargarlo.
smci

Respuestas:

81

No, no desinstala los paquetes de dependencias. Solo elimina el paquete especificado:

$ pip install specloud
$ pip freeze # all the packages here are dependencies of specloud package

figleaf == 0.6.1
nose == 1.1.2
pinocchio == 0.3
specloud == 0.4.5

$ pip uninstall specloud
$ pip freeze

figleaf == 0.6.1
nariz == 1.1.2
pinocho == 0.3

Como puede ver, esos paquetes son dependencias specloudy todavía están allí, pero no el specloudpaquete en sí.

Como se menciona a continuación, puede instalar y usar la utilidad pip-autoremove para eliminar un paquete más dependencias no utilizadas.

BernardoBarreto
fuente
2
¿Qué pasa con los paquetes exclusivos de dependencia del specloudpaquete?
Fusion
@Fusion Esos paquetes son la dependencia del specloud.
BernardoBarreto
251

Puede instalar y usar la utilidad pip-autoremove para eliminar un paquete más dependencias no utilizadas.

# install pip-autoremove
pip install pip-autoremove
# remove "somepackage" plus its dependencies:
pip-autoremove somepackage -y
bwv549
fuente
9
Desafortunadamente, todavía no tiene soporte real para Python3 (ver github.com/invl/pip-autoremove/issues/18 ).
asmaier
10
Funcionó bien para mí en Python 3 a partir de octubre de 2019.
refrigerios
@ loved.by.Jesus: estoy en Python 3.8.3 y probé y aún veo el comando ejecutado como pip-autoremove(guión no subrayado). pip_autoremoveme da command not found.
bwv549
@ bwv549 Tengo que explicar que lo ejecuté a través de python<version>(cuando se debe especificar la versión). De esa manera, necesitamos adaptar el nombre a pip_autoremove(el guión no está permitido como nombre del paquete). Por ejemplo python3.8 pip_autoremovefunciona pero python3.8 pip-autoremoveno funciona. De lo contrario, como señaló, como un simple comando de terminal pip-autoremove, funciona perfectamente :), aunque solo se utiliza la versión de Python predeterminada del sistema. Gracias por tu mensaje.
amado.por.Jesús
9

He eliminado con éxito las dependencias de un paquete usando esta línea bash:

for dep in $(pip show somepackage | grep Requires | sed 's/Requires: //g; s/,//g') ; do pip uninstall -y $dep ; done

esto funcionó en pip 1.5.4

linibou
fuente
40
Aunque técnicamente esta solución elimina con éxito todas las dependencias, como se menciona en las otras respuestas, también desinstala las dependencias que no son exclusivas del destino , incluidas las instaladas desde los paquetes del sistema. Por ejemplo, en mi sistema este script finalmente falló porque el paquete de destino tenía dependencias en común con pip, por lo que pip desinstaló sus propias dependencias antes de que el script pudiera finalizar y luego falló.
sinisterstuf
19
Tenga en cuenta que esto elimina solo las dependencias de nivel inferior, pero no las dependencias de esas dependencias.
tamakisquare
0

He encontrado la solución a pesar de que puede ser un poco difícil de llevar a cabo para algunos.

1er paso (para python3 y linux):
pip3 instalar pip-autoremove
2do paso:
cd /home/usernamegoeshere/.local/bin/
3er paso:
gedit /home/usernamegoeshere/.local/lib/python3.8/site-packages/ pip_autoremove.py
y cambie todos los pip (s) a pip3 4to paso: ./pip-autoremove packagenamegoeshere

Al menos, esto fue lo que funcionó para mí ...

david david
fuente
-1

Puede probar https://github.com/cls1991/pef . Eliminará el paquete con todas sus dependencias.

cls1991
fuente
pef solo parece funcionar en entornos virtuales, desafortunadamente.
Bas
Es solo por cuestiones de seguridad, puede piratear el código, simplemente apague el código de protección.
cls1991
1
¿Se asegura de que esas dependencias estén "colgando", es decir, innecesarias por otras distribuciones?
wim
Sí, se basa en el recuento de referencias.
cls1991
Hola chicos, he bifurcado y modificado el código. Por favor encuentre el enlace a continuación. github.com/nalangekrushna/pef
Krissh