Wie aktualisiere ich alle Python-Pakete mit pip?


2050

Ist es möglich, alle Python-Pakete gleichzeitig zu aktualisieren pip?

Hinweis : Auf dem offiziellen Issue-Tracker gibt es hierfür eine Funktionsanforderung .


37
Vorsicht vor Software Rot - Durch das Aktualisieren von Abhängigkeiten kann Ihre App beschädigt werden. Sie können die genaue Version aller installierten Pakete mit pip freeze(wie bundle installoder npm shrinkwrap) auflisten . Speichern Sie am besten eine Kopie davon, bevor Sie basteln.
Colonel Panic

Beachten Sie dabei, dass Sie Ihre pipInstallation beim Upgrade vermasseln requests. Die Fehlermeldung lautet cannot import name IncompleteRead.
Paul Rooney

11
Ich habe eine Reihe von Antworten ausprobiert und eine neuere (und daher niedrig bewertete) Antwort liefert eine weitaus bessere Ausgabe: stackoverflow.com/questions/2720014/…
FauChristian


Diese Frage ist so alt und so nützlich, dass ich jeden, der von jetzt an hierher kommt, darauf aufmerksam machen möchte, dass es jetzt einen neuen offiziellen besten Weg gibt, dies alles zu tun: pipenv. Docs sind hier: docs.pipenv.org/basics und der Pycon 2018 des Autors darüber ist hier: youtube.com/watch?v=GBQAKldqgZs . Viel Spaß beim Codieren!
Malik A. Rumi

Antworten:


2259

Es gibt noch keine eingebaute Flagge, aber Sie können verwenden

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

Hinweis: Hierfür gibt es unendlich viele mögliche Variationen. Ich versuche, diese Antwort kurz und einfach zu halten, aber bitte schlagen Sie Variationen in den Kommentaren vor!

In älteren Versionen von pipkönnen Sie dies stattdessen verwenden:

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

Das grepheißt, bearbeitbare ("-e") Paketdefinitionen zu überspringen, wie von @jawache vorgeschlagen. (Ja, Sie könnten grep+ cutdurch sedoder awkoder perloder ... ersetzen .)

Das -n1Flag für xargsverhindert, dass alles gestoppt wird, wenn die Aktualisierung eines Pakets fehlschlägt (danke @andsens ).


59
Richtig :( Das Problem ist jetzt unter github.com/pypa/pip/issues/59 zu finden . Aber jeder Vorschlag scheint mit "Ja, aber ich bin mir zu sicher, ob X der richtige Weg ist, Y zu tun" beantwortet zu werden ... Jetzt ist besser als nie?
Praktikabilität

20
Es werden auch die Pakete gedruckt, die mit einem normalen Paketmanager (wie apt-get oder Synaptic) installiert wurden. Wenn ich dies ausführe pip install -U, werden alle Pakete aktualisiert. Ich fürchte, es kann zu Konflikten mit apt-get kommen.
Jabba

8
Wie wäre es, wenn Sie grep in: egrep -v '^ (\ - e | #)' ändern (ich erhalte diese Zeile, wenn ich sie unter Ubuntu 12.10 ausführe: "## FIXME: Die svn-URL konnte in dependency_links für dieses Paket nicht gefunden werden:".
LasseValentini

32
Ich würde teevor dem eigentlichen Upgrade eine einwerfen, damit Sie eine Liste der ursprünglichen Versionen erhalten. Auf pip freeze --local | tee before_upgrade.txt | ...diese Weise wäre es einfacher, bei Problemen zurückzukehren.
Emil H

10
Ich habe hinzugefügt -H, sudoum eine nervige Fehlermeldung zu vermeiden: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
Mario S

683

Sie können den folgenden Python-Code verwenden. Im Gegensatz pip freezedazu werden hiermit keine Warnungen und FIXME-Fehler gedruckt. Für 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)

Für 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)

21
Das funktioniert erstaunlich gut… Es ist immer so befriedigend, wenn eine Aufgabe WIRKLICH lange dauert … und gibt Ihnen eine Menge neuer Dinge! PS: Führen Sie es als Root aus, wenn Sie unter OS X arbeiten!
Alex Gray

52
Gibt es keine Möglichkeit, mit pip zu installieren, ohne einen Unterprozess aufzurufen? So etwas wie import pip pip.install('packagename')?
Endolith

6
Ich habe das in eine fabfile.py eingewickelt . Vielen Dank!
Josh K

5
@ BenMezger: Sie sollten wirklich keine Systempakete in Ihrer virtuellen Umgebung verwenden. Sie sollten auch wirklich nicht mehr als eine Handvoll vertrauenswürdiger, bekannter Programme als Root ausführen. Führen Sie Ihre virtuellen Umgebungen mit --no-site-packages aus (Standard in neueren Versionen).
Jeffcook2150

3
Daumen hoch für diese, die gewählte Antwort (oben) schlägt fehl, wenn ein Paket nicht mehr gefunden werden kann. Dieses Skript fährt einfach mit den nächsten Paketen fort, wunderbar.
Josh

643

So aktualisieren Sie alle lokalen Pakete; Sie könnten verwenden pip-review:

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

pip-reviewist eine Gabelung von pip-tools. Siehe pip-toolsAusgabe von erwähnten @knedlsepp . pip-reviewPaket funktioniert, aber pip-toolsPaket funktioniert nicht mehr.

pip-reviewfunktioniert unter Windows seit Version 0.5 .


2
@ Hauzer: Es unterstützt Python 3. Obwohl es ein Fehler sein könnte
jfs

7
@mkoistinen Es ist ein gutes Tool, aber bis es in PIP zusammengeführt wird, bedeutet es, etwas Zusätzliches zu installieren, das möglicherweise nicht jeder tun möchte.
Wernight

2
@ Daniel: Pip-Tools funktionieren nicht mehr, Pip-Review (Gabel der Pip-Tools) funktioniert.
JFS

7
Pip-Review funktioniert einwandfrei (zumindest für Python Version 3.5.0)
FredrikHedman

15
So aktualisieren Sie alle ohne interaktiven Modus:pip-review --local --auto
Dlamini

333

Funktioniert unter Windows. Sollte auch für andere gut sein. ($ ist das Verzeichnis, in dem Sie sich in der Eingabeaufforderung befinden, z. B. C: / Users / Username>)

tun

$ pip freeze > requirements.txt

Öffnen Sie die Textdatei, ersetzen Sie sie ==durch >=und führen Sie sie aus

$ pip install -r requirements.txt --upgrade

Wenn Sie ein Problem mit einem bestimmten Paket haben, das das Upgrade blockiert (manchmal numpy), gehen Sie einfach in das Verzeichnis ($), kommentieren Sie den Namen aus (fügen Sie ein # davor hinzu) und führen Sie das Upgrade erneut aus. Sie können diesen Abschnitt später wieder auskommentieren. Dies eignet sich auch hervorragend zum Kopieren von globalen Python-Umgebungen.


Ein anderer Weg:

Ich mag auch die Pip-Review-Methode:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

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

Sie können 'a' auswählen, um alle Pakete zu aktualisieren. Wenn ein Upgrade fehlschlägt, führen Sie es erneut aus und es wird beim nächsten fortgesetzt.


29
Sie sollten requirements.txt's entfernen =={version}. Zum Beispiel: In python-dateutil==2.4.2dem python-dateutilfür alle Linien.
Youngminz

4
Ich habe festgestellt, dass dies die Pakete unter macOS nicht wirklich aktualisiert hat.
Jkooker

10
@youngminz Ich würde ein kurzes 'Ersetzen Sie alle "=="> "> ="' in Ihrem Editor / Ihrer Idee empfehlen, bevor Sie 'pip install ...' ausführen, um dies zu beheben
Amaury Liet

7
für Linux: $ pip freeze | cut -d '=' -f1> requirements.txtum die Version zu entfernen
Cavaz

1
Wenn die Shell, die Sie verwenden, bash ist, können Sie sie über pip3 install -r <(pip3 freeze) --upgrade Effektiv in einen Befehl kürzen. Es <(pip3 freeze)handelt sich um eine anonyme Pipe, die jedoch als
Dateiobjekt fungiert

128

Windows - Version nach ausgezeichnete Beratung Dokumentation für FORRob van der Woude

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

19
for /F "delims= " %i in ('pip list --outdated') do pip install -U %i Schneller, da nur versucht wird, "veraltete" Pakete zu aktualisieren
Refael Ackermann

3
@RefaelAckermann Ich vermute, dass dies langsamer sein wird als das Original :) Um zu wissen, welche Pakete veraltet sind, muss pip zuerst die neueste Version jedes Pakets überprüfen. Es funktioniert genauso wie der erste Schritt beim Aktualisieren und wird nicht fortgesetzt, wenn keine neuere Version verfügbar ist. In Ihrer Version überprüft pip die Versionen jedoch zweimal, das erste Mal, um die Liste veralteter Pakete zu erstellen, und das zweite Mal, wenn Pakete in dieser Liste aktualisiert werden.
Piotr Dobrogost

2
@RefaelAckermann Das Hochfahren von Pip ist um eine Größenordnung schneller als das Überprüfen der Version eines Pakets über das Netzwerk. Das ist also die Anzahl der zu optimierenden Überprüfungen, nicht die Anzahl der Spin-Ups. Meins macht n Schecks, dein macht n + m Schecks.
Piotr Dobrogost

2
+1 - Es ist der 6.20.2019, ich verwende Python 3.7.3 unter Windows 10 und dies war der beste Weg für mich, alle meine lokalen Pakete zu aktualisieren.
MacItaly

1
Die ersten beiden Zeilen der Ausgabe müssen übersprungen werden : for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i. Wenn dies aus einer Batchdatei ausgeführt wird, stellen Sie sicher, dass Sie %%ianstelle von verwenden %i. Beachten Sie auch, dass die Aktualisierung sauberer ist, pipbevor Sie diesen Befehl mit ausführen python -m pip install --upgrade pip.
Andy

126

Verwenden pipupgrade !

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

Mit pipupgrade können Sie Ihr System, Ihr lokales System oder Ihre Pakete von einer requirements.txtDatei aus aktualisieren ! Außerdem werden Pakete selektiv aktualisiert, bei denen Änderungen nicht unterbrochen werden. pipupgrade stellt außerdem sicher, dass Pakete aktualisiert werden, die in mehreren Python-Umgebungen vorhanden sind. Kompatibel mit Python2.7 +, Python3.4 + und pip9 +, pip10 +, pip18 +, pip19 +.

Geben Sie hier die Bildbeschreibung ein

HINWEIS: Ich bin der Autor des Tools.


1
Diese Methode hat eine viel sauberere Ausgabe als die Antwort von @ rbp
Gaia

7
Gute Idee, aber es bleibt für Checking...immer hängen, als ich es versuchte.
CGFoX

1
Einfach installiert und auch bei der Überprüfung stecken geblieben[0;93mChecking...[0m
Chris

1
@nathandrake Möchten Sie ein Problem auf der Seite mit den Problemen öffnen?
Achilles Gasper Rasquinha

2
Ich habe einen Fehler unter Windows 10 und Python 3.7.5 erhalten:ModuleNotFoundError: No module named 'ctypes.windll'
Qin Heyang

74

Sie können nur die veralteten Pakete drucken

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

14
In einer virtuellen Umgebung mache ich das so:pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'
Jeremy Blanchard

Heutzutage können Sie das auch mit tun python -m pip list outdated(obwohl es nicht im Anforderungsformat ist).
Jacktose

74

Diese Option erscheint mir einfacher und lesbarer:

pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`

Die Erklärung ist, dass pip list --outdatedeine Liste aller veralteten Pakete in diesem Format ausgegeben wird:

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

Überspringt im Befehl awk NR>2die ersten beiden Datensätze (Zeilen) und {print $1}wählt das erste Wort jeder Zeile aus (wie von SergioAraujo vorgeschlagen, habe ich entfernt, tail -n +3da awkdas Überspringen von Datensätzen tatsächlich möglich ist).


Wenn ein Upgrade fehlschlägt, erfolgt keines der Upgrades.
Boris

2
Sie können vermeiden, dass der Schwanz awk 'NR>2 {print $1}'die Ausgabe für Sie
bereinigt

@SergioAraujo, dadurch sieht die Lösung auch sauberer aus, danke für den Tipp!
Marc

67

Der folgende Einzeiler könnte sich als hilfreich erweisen:

(pip> 20,0)

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

Ältere Versionen:

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

xargs -n1 geht weiter, wenn ein Fehler auftritt.

Wenn Sie mehr "feinkörnige" Kontrolle darüber benötigen, was weggelassen wird und was einen Fehler auslöst, sollten Sie das -n1Flag nicht hinzufügen und die zu ignorierenden Fehler explizit definieren, indem Sie die folgende Zeile für jeden einzelnen Fehler "weiterleiten":

| sed 's/^<First characters of the error>.*//'

Hier ist ein Arbeitsbeispiel:

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

Musste Filter für Zeilen hinzufügen, die mit 'Could' und 'Some' beginnen, da pip anscheinend Warnungen an stdout sendet :(
Chip Camden

OK, das ist fair: Sie können beliebig viele hinzufügen | sed 's/^<First characters of the error>.*//'. Vielen Dank!
Raratiru

14
Oder:pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
Jens

51

Robustere Lösung

Verwenden Sie für pip3 Folgendes:

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

Entfernen Sie für Pip einfach die 3s als solche:

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

OSX-Kuriosität

OSX wird ab Juli 2017 mit einer sehr alten Version von sed (ein Dutzend Jahre alt) ausgeliefert. Verwenden Sie in der obigen Lösung -E anstelle von -r, um erweiterte reguläre Ausdrücke zu erhalten.

Lösen von Problemen mit gängigen Lösungen

Diese Lösung ist gut konzipiert und getestet 1 , während selbst bei den gängigsten Lösungen Probleme auftreten.

  • Portabilitätsprobleme aufgrund geänderter Pip-Befehlszeilenfunktionen
  • Absturz von xargs, weil häufig auftretende Pip- oder Pip3-untergeordnete Prozessfehler auftreten
  • Überfüllte Protokollierung aus der rohen xargs-Ausgabe
  • Verlassen Sie sich auf eine Python-zu-OS-Brücke, während Sie sie möglicherweise aktualisieren 3

Der obige Befehl verwendet die einfachste und portabelste Pip-Syntax in Kombination mit sed und sh, um diese Probleme vollständig zu lösen. Details des Sed-Betriebs können mit der kommentierten Version 2 überprüft werden .


Einzelheiten

[1] Getestet und regelmäßig in einem Linux 4.8.16-200.fc24.x86_64-Cluster verwendet und auf fünf anderen Linux / Unix-Varianten getestet. Es läuft auch unter Cygwin64, das unter Windows 10 installiert ist. Tests unter iOS sind erforderlich.

[2] Um die Anatomie des Befehls klarer zu sehen, entspricht dies genau dem obigen Befehl pip3 mit Kommentaren:

# 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] Das Aktualisieren einer Python- oder PIP-Komponente, die auch beim Aktualisieren einer Python- oder PIP-Komponente verwendet wird, kann eine mögliche Ursache für einen Deadlock oder eine Beschädigung der Paketdatenbank sein.


1
Eine andere Möglichkeit, die jurassische BSD sedvon OS X zu überwinden, ist die Verwendung von gsed(GNU sed). Um es zu bekommen,brew install gnu-sed
Walter Tross

@WalterTross ... Jurassic ... guter Adjektivgebrauch. Wir haben jetzt zwei Möglichkeiten, Update-Pip-Pakete mit einem schönen Audit-Trail auf dem Terminal zu gruppieren. (1) Verwenden Sie die Option -E wie in der Antwort und (2) installieren Sie gsed, um die Jurazeit zu verlassen.
Douglas Daseeco

41

Dies scheint prägnanter.

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

Erläuterung:

pip list --outdated bekommt Zeilen wie diese

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

Im cut -d ' ' -f1 , -d ' 'setzt „Raum“ als Trennzeichen, -f1Mittel , um die erste Spalte zu erhalten.

So werden die obigen Zeilen:

urllib3
wheel

dann gib sie weiter xargs , um den Befehl auszuführen pip install -U, wobei jede Zeile als anhängendes Argument dient

-n1begrenzt die Anzahl der an jeden Befehl übergebenen Argumente pip install -Uauf 1


Ich habe diese Warnung erhaltenDEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
Reman

2
@Reman: Das liegt daran, dass Sie Pip v9.0.1 verwenden. Dies ist nur eine Verfallsmeldung, was bedeutet, dass einige Funktionen in einer zukünftigen Pip-Version nicht überleben werden. Nichts,
worüber

Dies muss jedoch als endgültige Lösung gekennzeichnet werden. In der Tat wird die akzeptierte Antwort auf allen Pip-Paketen ausgeführt. Dies ist Zeitverschwendung, wenn Sie nur 1 oder 2 Pakete aktualisieren müssen. Diese Lösung wird stattdessen nur auf allen veralteten Paketen ausgeführt
AlessioX

34

Ich hatte das gleiche Problem mit dem Upgrade. Ich aktualisiere nie alle Pakete. Ich aktualisiere nur das, was ich brauche, da das Projekt möglicherweise kaputt geht.

Da es keine einfache Möglichkeit gab, Paket für Paket zu aktualisieren und die Datei " require.txt" zu aktualisierenrequirements.txt , habe ich diesen Pip-Upgrader geschrieben, der auch die Versionen in Ihrer Datei für die ausgewählten Pakete (oder alle Pakete) aktualisiert .

Installation

pip install pip-upgrader

Verwendungszweck

Aktivieren Sie Ihre virtuelle Umgebung (wichtig, da dadurch auch die neuen Versionen aktualisierter Pakete in der aktuellen virtuellen Umgebung installiert werden).

cd in Ihr Projektverzeichnis, und führen Sie dann Folgendes aus:

pip-upgrade

Erweiterte Verwendung

Wenn die Anforderungen an einem nicht standardmäßigen Speicherort platziert sind, senden Sie sie als Argumente:

pip-upgrade path/to/requirements.txt

Wenn Sie bereits wissen, welches Paket Sie aktualisieren möchten, senden Sie es einfach als Argumente:

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

Wenn Sie ein Upgrade auf die Version vor oder nach der Veröffentlichung durchführen müssen, fügen Sie --prereleaseIhrem Befehl ein Argument hinzu.

Vollständige Offenlegung: Ich habe dieses Paket geschrieben.


8
Dies sollte pip standardmäßig tun.
Nostalg.io

Heads-Up mit Ihrem Tool Einige Charakterfluchten scheinen auf meinem Windows-Computer nicht richtig zu funktionieren, aber
Luke

Ich habe es nicht wirklich unter Windows getestet, aber ich werde eine virtuelle Maschine installieren. Vielen Dank
Simion Agavriloaei

Wenn virtualenvnicht aktiviertpip-upgrade --skip-virtualenv-check
Morse

2
Dies funktioniert auch mit einem Anforderungsordner mit allgemeinen, Entwicklungs- und Produktanforderungen. Einfach großartig!
Whisperer


27

Einzeilige Version von @ Ramanas Antwort .

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

`


4
subprocess.call ("sudo pip install ... falls Sie Berechtigungen benötigen
Maximiliano Rios

4
@MaximilianoRios Bitte nicht sudo pip install, verwenden Sie einen virtuellen env , statt.
Bengt

22

Wenn Sie eine virtuelle Umgebung verwenden und nur Pakete aktualisieren möchten, die Ihrer virtuellen Umgebung hinzugefügt wurden , möchten Sie möglicherweise Folgendes tun:

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


18

Windows Powershell-Lösung

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

pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}?
Foad

2
Vielleicht pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}wäre angemessener.
Brainplot

16

Verwenden Sie awk-Update-Pakete: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

Windows Powershell Update foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}


pip freeze | awk -F '[=]' '{print $ 1}' | xargs pip install -U
JohnDHH

Und für Python 3 ... pip3 installiere -U $ (pip3 freeze | awk -F '[=]' '{print $ 1}')
Jimmy MG Lim

12

Sie können dies versuchen:

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

Dies ist die sauberste und am besten lesbare Methode, um Pip-Pakete in kürzester Zeit zu aktualisieren. groß.
Mark Shust an der M.academy

12

Das ziemlich erstaunliche Eigelb macht dies einfach.

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

Weitere Informationen zu Eigelb finden Sie unter https://pypi.python.org/pypi/yolk/0.4.3

Es kann viele Dinge tun, die Sie wahrscheinlich nützlich finden.


3
Ihre Antwort wurde geändert von yolkauf yolk3k, Ihre ursprüngliche Antwort auf jeden Fall hatte Probleme mit python3.
AXO

10

@ Ramanas Antwort hat für mich am besten funktioniert, aber ich musste ein paar Fänge hinzufügen:

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

Das site-packages Prüfung schließt meine Entwicklungspakete aus, da sie sich nicht im Verzeichnis der System-Site-Pakete befinden. Das try-außer überspringt einfach Pakete, die aus PyPI entfernt wurden.

@endolith: Ich hatte auch auf ein einfaches gehofft pip.install(dist.key, upgrade=True), aber es sieht nicht so aus, als ob pip nur für die Befehlszeile verwendet werden sollte (in den Dokumenten wird die interne API nicht erwähnt, und die Pip-Entwickler haben sie nicht verwendet docstrings).


Stellt unter Ubuntu (und anderen Debian-Derivaten) pipanscheinend Pakete ein /usr/local/lib/python2.7/dist-packagesoder ähnliches. ifIn diesem Fall könnten Sie in der Anweisung '/ usr / local / lib /' anstelle von 'site-packages' verwenden .
Drevicko

10

Das pip_upgrade_outdatedmacht den Job. Laut seinen Dokumenten :

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

Schritt 1:

pip install pip-upgrade-outdated

Schritt 2:

pip_upgrade_outdated

1
Schritt 1: Pip installieren Pip-Upgrade-veraltet Schritt 2: Pip-Upgrade-veraltet ... fertig
shao.lo

9

Gesendet durch eine Pull-Anfrage an die Pip-Leute ; Verwenden Sie in der Zwischenzeit diese Pip-Bibliothekslösung, die ich geschrieben habe:

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

Version mit Fehlerbehandlung (gemäß Kommentar): gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
Samuel Marks

9

Das schien für mich zu funktionieren ...

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

Ich habe printfdanach ein Leerzeichen verwendet, um die Paketnamen richtig zu trennen.


7

Dies ist eine PowerShell-Lösung für Python 3:

pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }

Und für Python 2:

pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }

Dadurch werden die Pakete einzeln aktualisiert. Also a

pip3 check
pip2 check

Danach sollte sichergestellt werden, dass keine Abhängigkeiten unterbrochen werden.



7

Das kürzeste und einfachste unter Windows.

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

@Enkouyami unter Windows 7 Dieser Befehl funktioniert nicht ohne -r. -r muss den Pfad zur Anforderungsdatei ausschließen.
Chockomonkey

6

Mein Skript:

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

6

Ist das nicht effektiver?

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 listet veraltete Pakete auf;
  2. grep -v -i warning invertierte Übereinstimmung auf warning , um Fehler beim Aktualisieren zu vermeiden
  3. cut -f1 -d1' ' gibt das erste Wort zurück - den Namen des veralteten Pakets;
  4. tr "\n|\r" " "konvertiert das mehrzeilige Ergebnis von cutin eine einzeilige, durch Leerzeichen getrennte Liste;
  5. awk '{if(NR>=3)print}' Überspringt Kopfzeilen
  6. cut -d' ' -f1 holt die erste Spalte
  7. xargs -n1 pip install -U Nimmt 1 Argument aus der Pipe links davon und übergibt es an den Befehl, um die Liste der Pakete zu aktualisieren.

Hier ist meine Ausgabe: kerberos iwlib PyYAML Could pygpgme Could Could Could ...Beachten Sie alle "Könnte". Diese stammen aus der Ausgabe von pip list -o"Konnte keine Downloads finden, die die Anforderung <Paket> erfüllen"
DrStrangepork

Können Sie die Ausgabe von einfügen pip list -o?
Alex V

Kommentare formatieren das nicht gut, aber hier ist ein Ausschnitt (Zeilenenden sind mit ';' gekennzeichnet):# pip list -o; urwid (Current: 1.1.1 Latest: 1.3.0); Could not find any downloads that satisfy the requirement python-default-encoding; pycups (Current: 1.9.63 Latest: 1.9.68); Could not find any downloads that satisfy the requirement policycoreutils-default-encoding; Could not find any downloads that satisfy the requirement sepolicy;
DrStrangepork

Anstatt alle Zeilen herauszufiltern, die nicht verwendet werden sollten, würde ich vorschlagen, die Zeilen herauszufiltern, in denen ein Update vorhanden ist : pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ") . Andernfalls könnten Sie leicht eine Zeile verpassen, die Sie nicht möchten, und das von DrStrangeprk erwähnte Ergebnis erhalten.
Antibus

Ich würde dringend empfehlen, xargsstattdessen zu verwenden. pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -UDas -rFlag stellt sicher, dass pip install -Ues nicht ausgeführt wird, wenn keine veralteten Pakete vorhanden sind. Das -pFlag fordert den Benutzer zur Bestätigung auf, bevor er einen Befehl ausführt. Sie können das -n1Flag hinzufügen , damit Sie aufgefordert werden, bevor Sie jedes Paket separat installieren.
Sechs

6

eine Zeile in Powershell 5.1 mit Adm-Rechten, Python 3.6.5 und Pip Version 10.0.1:

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

es funktioniert reibungslos, wenn die Liste keine kaputten Pakete oder Spezialräder enthält ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.