web-dev-qa-db-de.com

Unterschied zwischen den Pip-Installationsoptionen "Ignoriert-Installiert" und "Neuinstallation erzwingen"

Es gibt zwei pip install Optionen für die Neuinstallation der Pakete, die --ignore-installed und --force-reinstall.

Diese beiden Optionen werden im offiziellen Dokument wie folgt beschrieben

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

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

Es scheint, dass sie alle etwas ignorieren und die Neuinstallation durchführen, aber ich kann keinen Unterschied zwischen ihnen feststellen (ich kann einen Unterschied feststellen, wenn ich sie tatsächlich ausführe ... aber ich kann es nicht erklären). Wenn ich nach "Neuinstallation von Paketen in pip erzwingen" suche, werden im Ergebnis beide --ignore-installed und --force-reinstall, was mich lange verwirrt.

21
Daniel Chen

--force-reinstall

Deinstallieren Sie ein bereits installiertes Paket, bevor Sie es installieren. Das ist so ziemlich das Gleiche wie das Ausführen von pip uninstall -y dep && pip install dep Für package und jede Abhängigkeit davon.

--ignore-installed

Ignoriert, ob das Paket und seine Abhängigkeiten bereits installiert sind, und überschreibt installierte Dateien. Dies bedeutet, dass Sie eine Situation haben können, in der --ignore-installed Eine Datei nicht deinstalliert und sie für immer in site-packages Belässt. Stellen Sie sich vor, Sie haben pkgname==1.0, Das das Modul spam bereitstellt:

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

und die nächste Version pkgname==2.0 benannte spam in eggs um. Wenn Sie pip install pkgname==2.0 --ignore-installed Ausführen, wird spam.py Erst dann entfernt, wenn Sie es manuell entfernen.

Folge

--force-reinstall Sollte immer bevorzugt werden; Verwenden Sie --ignore-installed nur, wenn Sie weiß was du tust Sind Sie sicher, dass die Neuinstallation die aktuell installierten Dateien überschreibt. Andernfalls können nach der Neuinstallation undeutliche Importfehler auftreten, da veraltete Module in sys.path Noch verfügbar sind.

Beispiel

Beispiel für die Reproduktion mit den neuesten pip Änderungen, bei denen alle Pakete unter das Paket _internal Verschoben wurden: Erstellen Sie eine neue virtuelle Umgebung und stufen Sie pip auf Version 9 herunter:

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

Wenn Sie jetzt pip über --force-reinstall Auf die neueste Version aktualisieren möchten, wird ein sauberes Upgrade durchgeführt. Danach haben Sie die richtige Paketstruktur mit _internal Und _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

Wenn Sie das Upgrade stattdessen mit --ignore-installed Durchführen würden:

(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

Durch das Aktualisieren von pip mit --ignore-installed Wurde die vorherige Paketversion nicht zuerst deinstalliert. Aufgrund der neuen Dateistruktur wurden die alten Dateien nicht durch neue Dateien überschrieben. Infolgedessen werden alte Dateien jetzt verwaist und von keinem Paket mehr abgeholt. Selbst pip uninstall pip entfernt die verwaisten Dateien nicht. Man müsste sie manuell bereinigen.

26
hoefling