python pip install manually




Aggiornamento di tutti i pacchetti con pip (20)

È possibile aggiornare tutti i pacchetti Python contemporaneamente con pip ?

Nota che c'è una richiesta di funzionalità per questo sul tracker ufficiale dei problemi.


Che ne dite di:

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


Ecco uno script che aggiorna solo i pacchetti obsoleti.

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)

Funziona su Windows. Dovrebbe essere buono anche per gli altri. ($ è la directory in cui ti trovi, nel prompt dei comandi, ad esempio C: / Users / Username>)

fare

$ pip freeze > requirements.txt

apri il file di testo, sostituisci il == con> =

Quindi fa

$ pip install -r requirements.txt --upgrade

Se si verifica un problema con un determinato pacchetto che interrompe l'aggiornamento (a volte numpy), basta andare alla directory ($), commentare il nome (aggiungere un # prima di esso) ed eseguire di nuovo l'aggiornamento. Puoi in seguito decommentare quella sezione. Questo è anche ottimo per copiare ambienti globali Python.

Mi piace anche il metodo di revisione dei pip:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip_review --local --interactive

È possibile selezionare 'a' per aggiornare tutti i pacchetti; se un aggiornamento fallisce, eseguirlo di nuovo e continua al prossimo.


Ho provato il codice di Ramana e ho scoperto su Ubuntu che devi scrivere sudo per ogni comando. Ecco il mio script che funziona bene su 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)

Il più breve e più semplice su Windows.

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

Il tuorlo piuttosto sorprendente rende questo facile.

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

Per maggiori informazioni su tuorlo: https://pypi.python.org/pypi/yolk/0.4.3

Può fare un sacco di cose che probabilmente troverai utili.


Inviato attraverso una richiesta di pull al folk pip ; nel frattempo uso questa soluzione di pip library che scrissi:

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


La versione One-liner di @ risposta di Ramana .

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

`


Non c'è ancora una bandiera incorporata, ma puoi usarla

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

Nota: ci sono infinite potenziali variazioni per questo. Sto cercando di mantenere questa risposta breve e semplice, ma ti preghiamo di suggerire variazioni nei commenti!

Nella versione precedente di pip , puoi invece utilizzare questo:

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

grep deve saltare le definizioni del pacchetto modificabili ("-e"), come suggerito da @jawache. (Sì, potresti sostituire grep + cut con sed o awk o perl o ...).

Il flag -n1 per xargs impedisce l'interruzione di tutto se l'aggiornamento di un pacchetto fallisce (grazie a @andsens ).


Per aggiornare tutti i pacchetti locali; potresti usare pip-review :

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

pip-review è un fork di pip-tools . Vedi il problema dei pip-tools menzionato da @knedlsepp . pip-review pacchetto di pip-review funziona ma il pacchetto pip-tools non funziona più.

pip-review funziona su Windows dalla versione 0.5 .


Puoi semplicemente stampare i pacchetti che sono obsoleti

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

Puoi usare il seguente codice Python. A differenza del pip freeze , questo non stampa gli avvisi e gli errori FIXME. Per 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)

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

Questo sembra più conciso.

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

Spiegazione:

pip list --outdated ottiene linee come queste

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

In cut -d ' ' -f1 , -d ' ' imposta "spazio" come delimitatore, -f1 significa ottenere la prima colonna.

Quindi le linee precedenti diventano:

urllib3
wheel

quindi xargs a xargs per eseguire il comando, pip install -U , con ogni riga come argomenti aggiunti

-n1 limita il numero di argomenti passati a ciascun comando pip install -U per essere 1


Questo sembrava funzionare per me ...

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

Ho usato printf con uno spazio in seguito per separare correttamente i nomi dei pacchetti.


Versione di Windows dopo aver consultato l'eccellente documentation di FOR di Rob van der Woude

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

ecco un altro modo di fare con uno script in 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])

usa i pacchetti di aggiornamento di awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')


Soluzione più robusta

Per pip3 usa questo:

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

Per pip, basta rimuovere i 3 come tali:

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

OSD Oddity

OSX, a partire da luglio 2017, ha una versione molto vecchia di sed (una dozzina di anni). Per ottenere espressioni regolari estese, utilizzare -E anziché -r nella soluzione sopra.

Risoluzione dei problemi con soluzioni popolari

Questa soluzione è ben progettata e testata 1 , mentre ci sono problemi anche con le soluzioni più diffuse.

  • Problemi di portabilità dovuti alla modifica delle caratteristiche della riga di comando del pip
  • Arresto anomalo di xargs perché errori comuni del processo figlio pip o pip3
  • Registrazione affollata dall'output di xargs grezzo
  • Affidarsi a un bridge da Python a OS mentre potenzialmente aggiornandolo 3

Il comando precedente utilizza la sintassi pip più semplice e più portatile in combinazione con sed e sh per superare completamente questi problemi. I dettagli dell'operazione sed possono essere esaminati con la versione commentata 2 .

Dettagli

[1] Testato e regolarmente utilizzato in un cluster Linux 4.8.16-200.fc24.x86_64 e testato su altri cinque sapori Linux / Unix. Funziona anche su Cygwin64 installato su Windows 10. Sono necessari test su iOS.

[2] Per vedere l'anatomia del comando più chiaramente, questo è l'equivalente esatto del precedente comando pip3 con commenti:

# 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] L'aggiornamento di un componente Python o PIP che viene anche utilizzato nell'aggiornamento di un componente Python o PIP può essere una potenziale causa di un deadlock o del danneggiamento del database del pacchetto.







pip