Solución más robusta
Para pip3 use esto:
pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh
Para pip, simplemente elimine los 3 como tales:
pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh
Rareza OSX
OSX, a partir de julio de 2017, se entrega con una versión muy antigua de sed (una docena de años). Para obtener expresiones regulares extendidas, use -E en lugar de -r en la solución anterior.
Resolver problemas con soluciones populares
Esta solución está bien diseñada y probada 1 , mientras que hay problemas incluso con las soluciones más populares.
- Problemas de portabilidad debido a las características cambiantes de la línea de comando pip
- Fallo de xargs debido a fallas comunes en los procesos secundarios pip o pip3
- Registro abarrotado de la salida de xargs sin procesar
- Confiar en un puente de Python a OS mientras se actualiza potencialmente 3
El comando anterior utiliza la sintaxis de pip más simple y portátil en combinación con sed y sh para superar estos problemas por completo. Los detalles de la operación sed se pueden analizar con la versión comentada 2 .
Detalles
[1] Probado y utilizado regularmente en un clúster de Linux 4.8.16-200.fc24.x86_64 y probado en otros cinco sabores de Linux / Unix. También se ejecuta en Cygwin64 instalado en Windows 10. Se necesitan pruebas en iOS.
[2] Para ver la anatomía del comando más claramente, este es el equivalente exacto del comando pip3 anterior con comentarios:
# 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] La actualización de un componente Python o PIP que también se usa en la actualización de un componente Python o PIP puede ser una causa potencial de un punto muerto o corrupción de la base de datos del paquete.
pip freeze
(comobundle install
onpm shrinkwrap
). Lo mejor es guardar una copia de eso antes de jugar.