Update all python packages

Problemstellung:

  • Alle python packages auf einem System auf einmal aktualisieren:

Lösungsansatz:

Wie bei Linux selbst (apt-get) oder anderen Frameworks gibt es auch bei Python die Möglichkeit festzustellen, welche Pakete aktualisiert werden können. Leider gibt es bislang keinen einfachen pip Parameter, um sämtliche Pakete auf dem System zu aktualisieren.

Der Lösungsansatz besteht darin, über pip eine Liste der nicht aktuellen Pakete zu erzeugen, diese formattechnisch aufzubereiten und als Input an das –upgrade Kommando von pip weiterzu“pipen“. Das Kommando zum Erzeugen der Liste durch pip ist relativ einfach.

sudo pip list --outdated

Es wird dann eine Liste der Pakete angezeigt, bei denen es eine aktueller Version gibt.

Formatierung der Liste

Die Darstellung der Liste variiert je nach der pip Konfiguration in der pip.conf (Linux) bzw. pip.ini (Windows). In der Version 9.0.1 erscheint zudem noch die folgende Meldung:

DEPRECATION: 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.

Im Prinzip wird hier schon alles gesagt. Wenn man also die Kontrolle über den pip list output erlangen möchte, kann man (a) das gewünschte Format als Kommandozeile mit geben oder (b) den Standardparameter in der pip Konfigurationsdatei angeben.

(a) Kommandozeile:

Die Option lautet –format. Dahinter wird nur mit einem Leerzeichen getrennt das gewünscht Format angegeben. Möglich sind legacy, columns, freeze oder json.

sudo pip list --outdated --format columns
(b) Konfigurationsdatei:

Um im gesamten System die Standardeinstellung zu setzen, muss der gewünschte Standard in der pip Konfigurationsdatei in der Section [list] hinterlegt werden. Für das Format legacy muss die Datei den folgenden Inhalt haben. Die Formatnamen sind zur Kommandozeile identisch.

[list]
format=legacy

Bei der Konfigurationsdatei gibt es Unterschiede bzgl. des Pfads und des Dateinamens im System.

Windows:
Dateiname: pip.ini
Pfadname: %appdata%/pip

Wenn der Ordner pip unterhalb von %appdata% nicht vorhanden ist, dann einfach anlegen und die Datei pip.ini erzeigen.

Linux:

Bei Linux wird die pip.conf im Home Directory des Users im Ordner .pip gespeichert. Achtung: Da pip meist unter sodu ausgeführt wird, muss die pip.conf in /root/.pip/pip.conf editiert werden.

Dateiname: pip.conf
Pfadname: ~/.pip

Update aller Pakete unter Linux:

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

Update aller Pakete unter Windows:

Due to the fact that the string regex console commands are diffent, we have to dig a little bit in good old MS-DOS console commands.

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