Diferencia entre las opciones de instalación de pip “ignorar-instalado” y “forzar-reinstalar”

4 minutos de lectura

Hay dos pip install opciones relacionadas con la reinstalación de los paquetes, que son --ignore-installed y --force-reinstall.

Estas dos opciones se describen a continuación en el documento oficial.

--force-reinstall
Reinstall all packages even if they are already up-to-date.

-I, --ignore-installed
Ignore the installed packages (reinstalling instead).

Parece que todos ignoran algo y hacen la reinstalación, pero no puedo notar la diferencia entre ellos (puedo ver alguna diferencia si realmente los ejecuto … pero no puedo explicar). Si busco “forzar reinstalación de paquetes en pip”, el resultado enumera ambos --ignore-installed y --force-reinstalllo que me confunde durante mucho tiempo.

avatar de usuario de hoefling
hurgando

--force-reinstall

Antes de instalar un paquete, primero lo desinstalará si ya está instalado. Casi lo mismo que correr pip uninstall -y dep && pip install dep para el paquete y todas sus dependencias.

--ignore-installed

Ignora si el paquete y sus dependencias ya están instalados, sobrescribiendo los archivos instalados. Esto significa que usted puede tener una situación en la que --ignore-installed no desinstala un archivo, dejándolo en site-packages para siempre. imagina que tienes pkgname==1.0 que proporciona el módulo spam:

$ pip show -f pkgname
Name: pkgname
Version: 1.0
...
spam.py

y la próxima versión pkgname==2.0 renombrado spam a eggs. al correr pip install pkgname==2.0 --ignore-installed, spam.py no se eliminará, quedará huérfano para siempre hasta que lo elimine manualmente.

Consecuencia

--force-reinstall siempre se debe preferir; usar --ignore-installed solo si tu sé lo que estás haciendo está seguro de que la reinstalación sobrescribirá los archivos instalados actualmente. De lo contrario, puede obtener errores de importación oscuros después de la reinstalación debido a que los módulos obsoletos aún están disponibles en sys.path.

Ejemplo

Ejemplo a reproducir con la última pip cambios donde todos sus paquetes se movieron bajo _internal paquete: crear un nuevo entorno virtual y degradar pip a la versión 9:

$ mkvirtualenv testenv
$ workon testenv
(testenv) $ pip install "pip<10"

Si ahora actualizaras pip a la última versión a través de --force-reinstall, se realiza una actualización limpia. Posteriormente, tiene la estructura de paquete correcta con el _internal y _vendor:

(testenv) $ pip install pip --upgrade --force-reinstall
(testenv) $ ls -l $VIRTUAL_ENV/lib/python3.7/site-packages/pip
total 16
-rw-r--r--   1 hoefling  staff   21 19 Aug 11:47 __init__.py
-rw-r--r--   1 hoefling  staff  623 19 Aug 11:47 __main__.py
drwxr-xr-x   4 hoefling  staff  128 19 Aug 11:47 __pycache__
drwxr-xr-x  25 hoefling  staff  800 19 Aug 11:47 _internal
drwxr-xr-x  26 hoefling  staff  832 19 Aug 11:47 _vendor

Si hicieras la actualización con --ignore-installed en cambio:

(testenv) $ pip install pip --upgrade --ignore-installed
(testenv) $ ls -l $VIRTUAL_ENV/lib/python3.7/site-packages/pip
total 392
-rw-r--r--   1 hoefling  staff     21 19 Aug 12:33 __init__.py
-rw-r--r--   1 hoefling  staff    623 19 Aug 12:33 __main__.py
drwxr-xr-x  14 hoefling  staff    448 19 Aug 12:33 __pycache__
drwxr-xr-x  25 hoefling  staff    800 19 Aug 12:33 _internal
drwxr-xr-x  28 hoefling  staff    896 19 Aug 12:33 _vendor
-rw-r--r--   1 hoefling  staff  11910 19 Aug 12:33 basecommand.py
-rw-r--r--   1 hoefling  staff  10465 19 Aug 12:33 baseparser.py
-rw-r--r--   1 hoefling  staff  16474 19 Aug 12:33 cmdoptions.py
drwxr-xr-x  16 hoefling  staff    512 19 Aug 12:33 commands
drwxr-xr-x   5 hoefling  staff    160 19 Aug 12:33 compat
-rw-r--r--   1 hoefling  staff  32153 19 Aug 12:33 download.py
-rw-r--r--   1 hoefling  staff   8121 19 Aug 12:33 exceptions.py
-rw-r--r--   1 hoefling  staff  39950 19 Aug 12:33 index.py
-rw-r--r--   1 hoefling  staff   5626 19 Aug 12:33 locations.py
drwxr-xr-x   5 hoefling  staff    160 19 Aug 12:33 models
drwxr-xr-x   6 hoefling  staff    192 19 Aug 12:33 operations
-rw-r--r--   1 hoefling  staff  10980 19 Aug 12:33 pep425tags.py
drwxr-xr-x   8 hoefling  staff    256 19 Aug 12:33 req
-rw-r--r--   1 hoefling  staff    156 19 Aug 12:33 status_codes.py
drwxr-xr-x  16 hoefling  staff    512 19 Aug 12:33 utils
drwxr-xr-x   8 hoefling  staff    256 19 Aug 12:33 vcs
-rw-r--r--   1 hoefling  staff  32010 19 Aug 12:33 wheel.py

actualización pip con --ignore-installed no desinstaló primero la versión del paquete anterior y, debido a la nueva estructura de archivos, los archivos nuevos no sobrescribieron los antiguos. Como consecuencia, los archivos antiguos ahora quedan huérfanos y ningún paquete los recoge; incluso pip uninstall pip no eliminará los archivos huérfanos. Uno tendría que limpiarlos manualmente.

  • Es --upgrade se necesita bandera con --force-reinstall?

    – mrgloom

    19 de agosto de 2019 a las 12:36

  • @mrgloom no, puede omitir eso con seguridad. --force-reinstall implica --upgrade de la misma manera que un pip uninstall seguido de un pip install haría (se encuentra e instala la versión más reciente que coincide con el especificador).

    – hurgando

    19 de agosto de 2019 a las 12:42

  • Tal vez soy yo, pero encuentro más simple y mnemotécnico que hacer pip uninstall package && pip install package 😀

    – Marco Sila

    26 de febrero de 2020 a las 10:48


Avatar de usuario de Ismael EL ATIFI
Ismael EL ATIFI

–ignore-installed también se puede usar si tiene un entorno virtual que hereda el paquete del sitio global y desea anular la instalación global (sin desinstalarlo).
Por ejemplo, puede tener la versión N en la instalación global de python y la versión N+1 en venv.

Es muy conveniente probar/depurar una nueva versión de un paquete en un entorno virtual.

  • Buen punto, esto también se aplica a las instalaciones de usuario (pip install --user) cuando necesite anular la instalación del sistema de un paquete.

    – hurgando

    6 de abril de 2020 a las 9:08

  • Para mí, --ignore-installed también ha sido muy útil cuando tuve problemas cuando pip quería desinstalar y reinstalar una dependencia porque no podía eliminar el __pycache__ dirs (me sucedió en un entorno Docker en un host CentOS 7, error extraño en el sistema de archivos)

    – Iván Sánchez

    28 de junio de 2021 a las 16:44


¿Ha sido útil esta solución?