Robustere Lösung
Verwenden Sie für pip3 Folgendes:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
Entfernen Sie für Pip einfach die 3s als solche:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
OSX-Kuriosität
OSX wird ab Juli 2017 mit einer sehr alten Version von sed (ein Dutzend Jahre alt) ausgeliefert. Verwenden Sie in der obigen Lösung -E anstelle von -r, um erweiterte reguläre Ausdrücke zu erhalten.
Lösen von Problemen mit gängigen Lösungen
Diese Lösung ist gut konzipiert und getestet 1 , während selbst bei den gängigsten Lösungen Probleme auftreten.
- Portabilitätsprobleme aufgrund geänderter Pip-Befehlszeilenfunktionen
- Absturz von xargs, weil häufig auftretende Pip- oder Pip3-untergeordnete Prozessfehler auftreten
- Überfüllte Protokollierung aus der rohen xargs-Ausgabe
- Verlassen Sie sich auf eine Python-zu-OS-Brücke, während Sie sie möglicherweise aktualisieren 3
Der obige Befehl verwendet die einfachste und portabelste Pip-Syntax in Kombination mit sed und sh, um diese Probleme vollständig zu lösen. Details des Sed-Betriebs können mit der kommentierten Version 2 überprüft werden .
Einzelheiten
[1] Getestet und regelmäßig in einem Linux 4.8.16-200.fc24.x86_64-Cluster verwendet und auf fünf anderen Linux / Unix-Varianten getestet. Es läuft auch unter Cygwin64, das unter Windows 10 installiert ist. Tests unter iOS sind erforderlich.
[2] Um die Anatomie des Befehls klarer zu sehen, entspricht dies genau dem obigen Befehl pip3 mit Kommentaren:
# match lines from pip's local package list output
# that meet the following three criteria and pass the
# package name to the replacement string in group 1.
# (a) Do not start with invalid characters
# (b) Follow the rule of no white space in the package names
# (c) Immediately follow the package name with an equal sign
sed="s/^([^=# \t\\][^ \t=]*)=.*"
# separate the output of package upgrades with a blank line
sed="$sed/echo"
# indicate what package is being processed
sed="$sed; echo Processing \1 ..."
# perform the upgrade using just the valid package name
sed="$sed; pip3 install -U \1"
# output the commands
sed="$sed/p"
# stream edit the list as above
# and pass the commands to a shell
pip3 freeze --local |sed -rn "$sed" |sh
[3] Das Aktualisieren einer Python- oder PIP-Komponente, die auch beim Aktualisieren einer Python- oder PIP-Komponente verwendet wird, kann eine mögliche Ursache für einen Deadlock oder eine Beschädigung der Paketdatenbank sein.
pip freeze
(wiebundle install
odernpm shrinkwrap
) auflisten . Speichern Sie am besten eine Kopie davon, bevor Sie basteln.