python - paquetes - instalar pip en windows 10




Actualizando todos los paquetes con pip (20)

¿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 multilínea del cut en una lista de una sola línea, 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 de la misma y lo pasa al comando para actualizar la lista de paquetes.

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

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


Aún 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 detener todo si falla la actualización de un paquete (gracias @andsens ).


Aquí hay otra forma de hacerlo con un script en python.

import pip, tempfile, contextlib

with tempfile.TemporaryFile('w+') as temp:
    with contextlib.redirect_stdout(temp):
        pip.main(['list','-o'])
    temp.seek(0)
    for line in temp:
        pk = line.split()[0]
        print('--> updating',pk,'<--')
        pip.main(['install','-U',pk])

Aquí hay una secuencia de comandos que solo actualiza los paquetes desactualizados.

import os, sys
from subprocess import check_output, call

file = check_output(["pip.exe",  "list", "--outdated", "--format=legacy"])
line = str(file).split()

for distro in line[::6]:
    call("pip install --upgrade " + distro, shell=True)

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

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt

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


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.


He probado el código de Ramana y descubrí que en Ubuntu tienes que escribir sudo para cada comando. Aquí está mi script que funciona bien en ubuntu 13.10:

#!/usr/bin/env python
import pip
from subprocess import call

for dist in pip.get_installed_distributions():
    call("sudo pip install --upgrade " + dist.project_name, shell=True)


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

pip list --format legacy --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/^<First characters of the error>.*//'

Aquí hay un ejemplo de trabajo:

pip list --format legacy --outdated | sed 's/(.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U

Mi guion:

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

Puedes probar esto:

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

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)

Simplemente puede imprimir los paquetes que están desactualizados

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

Solución Windows PowerShell

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

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

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

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()]'

`


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


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 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 se pueden examinar 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 bloqueo de la base de datos de paquetes o de interbloqueos.







pip