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.
--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.
--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 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.