Actualizando todos los paquetes con pip

¿Es posible actualizar todos los paquetes de Python a la vez con pip ?

Tenga en cuenta que existe una solicitud de características para esto en el rastreador oficial de problemas.

Todavía no hay una bandera incorporada, pero puedes usar

 pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U 

Nota: hay infinitas variaciones potenciales para esto. Estoy intentando que esta respuesta sea breve y simple, ¡pero sugiera variaciones en los comentarios!

En la versión anterior de pip , puedes usar esto en su lugar:

 pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U 

El grep es omitir definiciones de paquetes editables (“-e”), como lo sugiere @jawache. (Sí, puede reemplazar grep + cut con sed o awk o perl o …).

El indicador -n1 para xargs evita que se detenga todo si falla la actualización de un paquete (gracias @andens ).

Puedes usar el siguiente código de Python. A diferencia de la pip freeze , esto no imprimirá advertencias y errores de FIXME. Para pip <10.0.1

 import pip from subprocess import call packages = [dist.project_name for dist in pip.get_installed_distributions()] call("pip install --upgrade " + ' '.join(packages), shell=True) 

Para pip> = 10.0.1

 import pkg_resources from subprocess import call packages = [dist.project_name for dist in pkg_resources.working_set] call("pip install --upgrade " + ' '.join(packages), shell=True) 

Para actualizar todos los paquetes locales; usted podría usar pip-review :

 $ pip install pip-review $ pip-review --local --interactive 

pip-review es una bifurcación de pip-tools . Ver el problema de pip-tools mencionado por @knedlsepp . pip-review paquete pip-review funciona pero el paquete pip-tools ya no funciona.

pip-review funciona en Windows desde la versión 0.5 .

Funciona en Windows. Debería ser bueno para los demás también. ($ es el directorio en el que se encuentre, en el símbolo del sistema, por ejemplo, C: / Usuarios / Nombre de usuario>)

hacer

 $ pip freeze > requirements.txt 

abre el archivo de texto, reemplaza el == con> =

entonces hazlo

 $ pip install -r requirements.txt --upgrade 

Si tiene un problema con un determinado paquete que detiene la actualización (a veces, numpy), solo vaya al directorio ($), comente el nombre (agregue un # antes de él) y ejecute la actualización nuevamente. Más tarde puedes descomentar esa sección de nuevo. Esto también es ideal para copiar entornos globales de python.

También me gusta el método pip-review:

 py2 $ pip install pip-review $ pip-review --local --interactive py3 $ pip3 install pip-review $ py -3 -m pip_review --local --interactive 

Puede seleccionar ‘a’ para actualizar todos los paquetes; Si falla una actualización, ejecútela de nuevo y continúa en la siguiente.

Versión de Windows después de consultar excelente documentación para FOR por Rob van der Woude

 for /F "delims===" %i in ('pip freeze -l') do pip install -U %i 

Simplemente puede imprimir los paquetes que están desactualizados

 pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:' 

Los siguientes comentarios de una sola línea podrían ser de ayuda:

pip list --format freeze --outdated | sed 's/(.*//g' | xargs -n1 pip install -U

xargs -n1 sigue funcionando si se produce un error.

Si necesita más control “detallado” sobre lo que se omite y lo que genera un error, no debe agregar el indicador -n1 y definir explícitamente los errores a ignorar, al “canalizar” la siguiente línea para cada error por separado:

| sed 's/^.*//'

Aquí hay un ejemplo de trabajo:

 pip list --format freeze --outdated | sed 's/(.*//g' | sed 's/^.*//' | sed 's/^.*//' | xargs pip install -U 

Esta opción me parece más sencilla y legible:

 pip install -U `pip list --outdated | tail -n +3 | awk '{print $1}'` 

La explicación es que pip list --outdated genera una lista de todos los paquetes desactualizados en este formato:

 Package Version Latest Type --------- ------- ------ ----- fonttools 3.31.0 3.32.0 wheel urllib3 1.24 1.24.1 wheel requests 2.20.0 2.20.1 wheel 

tail -n +3 omite las dos primeras líneas y awk '{print $1}' selecciona la primera palabra de cada línea.

Esto parece más conciso.

 pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U 

Explicación:

pip list --outdated obtiene líneas como estas

 urllib3 (1.7.1) - Latest: 1.15.1 [wheel] wheel (0.24.0) - Latest: 0.29.0 [wheel] 

En el cut -d ' ' -f1 , -d ' ' establece “espacio” como delimitador, -f1 significa obtener la primera columna.

Así que las líneas anteriores se convierten en:

 urllib3 wheel 

luego xargs a xargs para ejecutar el comando, pip install -U , con cada línea como argumentos adjuntos

-n1 limita el número de argumentos pasados ​​a cada comando pip install -U para que sea 1

¡Usa pipupgrade !

 $ pip install pipupgrade $ pipupgrade --latest --yes 

¡pipupgrade lo ayuda a actualizar su sistema, local o paquetes desde un archivo Requirements.txt ! También actualiza selectivamente los paquetes que no rompen el cambio. Compatible con Python2.7 +, Python3.4 + y pip9 +, pip10 +, pip18 +.

introduzca la descripción de la imagen aquí

NOTA: Soy el autor de la herramienta.

Solución más robusta

Para pip3 usa esto:

 pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh 

Para pip, solo quita los 3s como tales:

 pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh 

OSX Oddity

OSX, a partir de julio de 2017, se envía 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.

Resolviendo problemas con soluciones populares

Esta solución está bien diseñada y probada 1 , mientras que existen problemas incluso con las soluciones más populares.

  • Problemas de portabilidad debido a las características cambiantes de la línea de comando pip
  • Bloqueo de xargs debido a fallas comunes en el proceso pip o pip3
  • Registro abarrotado de la salida de xargs en bruto
  • Confiar en un puente Python-to-OS y, potencialmente, actualizarlo 3

El comando anterior utiliza la syntax 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 se pueden examinar con la versión comentada 2 .


Detalles

[1] Probado y utilizado regularmente en un clúster 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 más claramente la anatomía del comando, 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 locking de la base de datos de paquetes o de interlockings.

Tuve el mismo problema con la actualización. La cosa es que nunca actualizo todos los paquetes. Actualizo solo lo que necesito, porque el proyecto puede fallar.

Debido a que no había una manera fácil de actualizar paquete por paquete, y actualizar el archivo Requirements.txt, escribí este pip-upgrader que también actualiza las versiones en su archivo Requirements.txt para los paquetes elegidos (o todos los paquetes).

Instalación

 pip install pip-upgrader 

Uso

Active su virtualenv (importante, porque también instalará las nuevas versiones de paquetes actualizados en virtualenv actual).

cd en su directorio de proyecto, luego ejecute:

 pip-upgrade 

Uso avanzado

Si los requisitos se colocan en una ubicación no estándar, envíelos como argumentos:

 pip-upgrade path/to/requirements.txt 

Si ya sabe qué paquete desea actualizar, simplemente envíelos como argumentos:

 pip-upgrade -p django -p celery -p dateutil 

Si necesita actualizar a la versión preliminar o posterior a la publicación, agregue el argumento --prerelease a su comando.

Revelación completa: escribí este paquete.

Desde https://github.com/cakebread/yolk :

 $ pip install -U `yolk -U | awk '{print $1}' | uniq` 

Sin embargo usted necesita primero obtener la yema:

 $ sudo pip install -U yolk 

Versión de una sola línea de la respuesta de @Ramana .

 python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]' 

`

cuando utilice un virtualenv y si solo desea actualizar los paquetes agregados a su virtualenv, puede hacerlo:

 pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade 

Solución Windows PowerShell

 pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_} 

La solución más simple y rápida que encontré en la discusión del tema pip es:

 sudo -H pip install pipdate sudo -H pipdate 

Fuente: https://github.com/pypa/pip/issues/3819

Puedes probar esto:

 for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done 

La yema bastante sorprendente hace esto fácil.

 pip install yolk3k # don't install `yolk`, see https://github.com/cakebread/yolk/issues/35 yolk --upgrade 

Para obtener más información sobre la yema: https://pypi.python.org/pypi/yolk/0.4.3

Puede hacer muchas cosas que probablemente encuentres útiles.

La respuesta de @Ramana funcionó mejor para mí, de las que están aquí, pero tuve que agregar algunas capturas:

 import pip for dist in pip.get_installed_distributions(): if 'site-packages' in dist.location: try: pip.call_subprocess(['pip', 'install', '-U', dist.key]) except Exception, exc: print exc 

La comprobación de los site-packages excluye mis paquetes de desarrollo, porque no se encuentran en el directorio de paquetes de sitio del sistema. El comando try-except simplemente omite los paquetes que se han eliminado de PyPI.

@endolith: También esperaba un pip.install(dist.key, upgrade=True) fácil pip.install(dist.key, upgrade=True) , pero no parece que pip esté destinado a ser usado por nada más que la línea de comandos (los documentos no mencionan la API interna, y los desarrolladores de pip no usaron cadenas de documentación).

Enviado a través de una solicitud de extracción a la gente pip ; Mientras tanto, use esta solución de biblioteca pip que escribí:

 from pip import get_installed_distributions from pip.commands import install install_cmd = install.InstallCommand() options, args = install_cmd.parse_args([package.project_name for package in get_installed_distributions()]) options.upgrade = True install_cmd.run(options, args) # Chuck this in a try/except and print as wanted 

Esto pareció funcionar para mí …

 pip install -U $(pip list --outdated|awk '{printf $1" "}') 

Utilicé printf con un espacio para separar correctamente los nombres de los paquetes.

use los paquetes de actualización de awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

Windows PowerShell, actualización de foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}

Mi guion:

 pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade 

¿No es esto más efectivo?

 pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U 
  1. pip list -o enumera paquetes obsoletos;
  2. grep -v -i warning coincidencia invertida en la warning para evitar errores al actualizar
  3. cut -f1 -d1' ' devuelve la primera palabra: el nombre del paquete desactualizado;
  4. tr "\n|\r" " " convierte el resultado de multilínea del cut en una sola línea, lista separada por espacios;
  5. awk '{if(NR>=3)print}' salta las líneas del encabezado
  6. cut -d' ' -f1 busca la primera columna
  7. xargs -n1 pip install -U toma 1 argumento de la tubería a la izquierda y lo pasa al comando para actualizar la lista de paquetes.

El más corto y fácil en Windows.

 pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt 
 import pip pkgs = [p.key for p in pip.get_installed_distributions()] for pkg in pkgs: pip.main(['install', '--upgrade', pkg]) 

o incluso:

 import pip commands = ['install', '--upgrade'] pkgs = commands.extend([p.key for p in pip.get_installed_distributions()]) pip.main(commands) 

Funciona rápido ya que no está constantemente lanzando un shell. Me encantaría encontrar el tiempo para obtener esto usando la lista obsoleta para acelerar aún más las cosas.

Qué tal si:

 pip install -r <(pip freeze) --upgrade 

una línea en powershell 5.1 con derechos de admisión, python 3.6.5 y pip ver 10.0.1:

 pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location} 

funciona sin problemas si no hay paquetes rotos o ruedas especiales en la lista …

El pip_upgrade_outdated hace el trabajo. Según sus documentos :

 usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD] [--serial | --parallel] [--dry_run] [--verbose] [--version] Upgrade outdated python packages with pip. optional arguments: -h, --help show this help message and exit -3 use pip3 -2 use pip2 --pip_cmd PIP_CMD use PIP_CMD (default pip) --serial, -s upgrade in serial (default) --parallel, -p upgrade in parallel --dry_run, -n get list, but don't upgrade --verbose, -v may be specified multiple times --version show program's version number and exit 

Paso 1:

 pip install pip-upgrade-outdated 

Paso 2:

 pip_upgrade_outdated