python - descargar - instalar pip
Actualizando todos los paquetes con pip (30)
¿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
-
pip list -o
enumera paquetes obsoletos; -
grep -v -i warning
coincidencia invertida en lawarning
para evitar errores al actualizar -
cut -f1 -d1'' ''
devuelve la primera palabra: el nombre del paquete desactualizado; -
tr "/n|/r" " "
convierte el resultado multilínea delcut
en una lista de una sola línea, separada por espacios; -
awk ''{if(NR>=3)print}''
salta las líneas del encabezado -
cut -d'' '' -f1
busca la primera columna -
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í está mi variación en la respuesta de rbp, que evita las distribuciones "editables" y de desarrollo. Comparte dos defectos del original: se vuelve a descargar y reinstala innecesariamente; y un error en un paquete evitará la actualización de cada paquete después de eso.
pip freeze |sed -ne ''s/==.*//p'' |xargs pip install -U --
Informes de errores relacionados, un poco inconexos después de la migración de bitbucket:
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)
Desde https://github.com/cakebread/yolk :
$ pip install -U `yolk -U | awk ''{print $1}'' | uniq`
Sin embargo, primero debes conseguir la yema:
$ sudo pip install -U yolk
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
Esta opción me parece más sencilla y legible:
pip install -U `pip list --outdated | awk ''{ print $1}''`
( awk ''{ print $1}''
selecciona la primera palabra de la línea (separada por un espacio))
Y esta versión permite la supresión del mensaje de advertencia de la pip list --outdated
:
pip install -U `pip list --outdated | awk ''!/Could not|ignored/ { print $1}''`
( awk ''!/<pattern>/''
elimina la línea que contiene un patrón dado. En mi caso, los mensajes de advertencia incluyen "No se pudo" y "Se ignoró" respectivamente)
Esto también podría usarse para abordar el próximo formato de columns
defecto:
pip install -U `pip list --format=columns --outdated | awk ''!/Package|---/{ print $1}''`
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.
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 vuelva a ejecutar la actualización. 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.
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)
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
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.
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
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 .
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)
Qué tal si:
pip install -r <(pip freeze) --upgrade
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 $_}
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.
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()]''
`
cuando use 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
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.
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).