web-dev-qa-db-fra.com

Différence entre les options d'installation de pip "ignore-installed" et "forcer-réinstaller"

Il y en a deux pip install options relatives à la réinstallation des packages, qui sont --ignore-installed et --force-reinstall.

Ces deux options décrites comme suit dans le document officiel

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

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

Il semble qu’ils ignorent tous quelque chose et fassent la réinstallation mais je ne peux pas faire la différence (je peux voir une différence si je les exécute réellement ... mais je ne peux pas expliquer). Si je recherche "forcer la réinstallation des paquets dans pip", le résultat indique les deux --ignore-installed et --force-reinstall, ce qui me trouble depuis longtemps.

21
Daniel Chen

--force-reinstall

Avant d'installer un paquet, le désinstallera d'abord s'il est déjà installé. Quasiment la même chose que d’exécuter pip uninstall -y dep && pip install dep Pour le paquet et toutes ses dépendances.

--ignore-installed

Ignore si le paquet et ses dep sont déjà installés, écrasant les fichiers installés. Cela signifie que vous pouvez avoir une situation où --ignore-installed Ne désinstalle pas un fichier, le laissant dans site-packages Pour toujours. Imaginez que vous avez pkgname==1.0 Qui fournit le module spam:

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

et la version suivante pkgname==2.0 a renommé spam en eggs. Lors de l'exécution de pip install pkgname==2.0 --ignore-installed, spam.py Ne sera pas supprimé, il sera laissé orphelin pour toujours jusqu'à ce que vous le supprimiez manuellement.

Conséquence

--force-reinstall Devrait toujours être préféré; utilisez --ignore-installed uniquement si vous sais ce que tu fais assurez-vous que la réinstallation écrasera les fichiers actuellement installés. Sinon, vous risquez d'obtenir des erreurs d'importation obscures après la réinstallation en raison de modules obsolètes toujours disponibles dans sys.path.

Exemple

Exemple pour reproduire avec les dernières modifications pip où tous ses packages ont été déplacés dans un package _internal: Créez un nouvel environnement virtuel et rétrogradez pip vers la version 9:

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

Si vous souhaitez maintenant mettre à niveau pip vers la dernière version via --force-reinstall, Une mise à niveau propre est effectuée. Ensuite, vous avez la structure de paquet correcte avec les variables _internal Et _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 vous souhaitez effectuer la mise à niveau avec --ignore-installed À la place:

(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

La mise à niveau de pip avec --ignore-installed N'a pas d'abord désinstallé la version précédente du paquet et, en raison de la nouvelle structure de fichier, les nouveaux fichiers n'ont pas remplacé les anciens. En conséquence, les anciens fichiers sont maintenant orphelins et ne sont récupérés par aucun paquet; même pip uninstall pip ne supprimera pas les fichiers orphelins. Il faudrait les nettoyer manuellement.

26
hoefling