Wie überprüfen Sie programmgesteuert in einem Skript, ob ein Paket die neueste Version hat, und geben ein wahres oder falsches zurück?
Ich kann mit einem Skript wie diesem überprüfen:
package='gekko'
import pip
if hasattr(pip, 'main'):
from pip import main as pipmain
else:
from pip._internal import main as pipmain
pipmain(['search','gekko'])
oder mit Kommandozeile:
(base) C:\User>pip search gekko
gekko (0.2.3) - Machine learning and optimization for dynamic systems
INSTALLED: 0.2.3 (latest)
Aber wie überprüfe ich programmgesteuert und gebe true oder false zurück?
pip
hat keine API. Vielleicht möchten Sie sich daspip-api
Projekt ansehen , aber es ist noch nicht viel da.Antworten:
Schnelle Version (nur das Paket überprüfen)
Der folgende Code ruft das Paket mit einer nicht verfügbaren Version wie auf
pip install package_name==random
. Der Aufruf gibt alle verfügbaren Versionen zurück. Das Programm liest die neueste Version.Das Programm wird dann ausgeführt
pip show package_name
und erhält die aktuelle Version des Pakets.Wenn eine Übereinstimmung gefunden wird, wird True zurückgegeben, andernfalls False.
Dies ist eine zuverlässige Option, da sie aktiviert ist
pip
Der folgende Code erfordert
pip list --outdated
:quelle
if (boolean): return True else: return False
ist besser , nur zureturn boolean
pip install p==0
zum Beispiel).random
ich bin sicher, es gibt keine zufällige VersionMein Projekt
johnnydep
hat diese Funktion.In der Schale:
In Python:
quelle
Bearbeiten: Pip-Suche entfernen
Vielen Dank für die verschiedenen Vorschläge. Hier ist eine neue Version, die nicht verwendet,
pip search
sondern die neueste Version direktpypi
von Daniel Hill abruft . Dies behebt auch das Problem mit den falschen Übereinstimmungen der Teilzeichenfolge.Ursprüngliche Antwort
Hier ist eine schnelle Lösung, die die neuesten Versionsinformationen nur für das
gekko
interessierende Paket abruft .Dies erzeugt die Nachricht
Latest version (0.2.3) of gekko is installed
und kehrt zurückTrue
, um die neueste Version (oderFalse
wenn nicht die neueste Version) anzugeben . Dies ist möglicherweise nicht die beste Lösung, da nur nach einem Versions-Teilstring gesucht wird,if d[name] in s.decode():
aber schneller alspip list --outdated
alle Pakete überprüft werden. Dies ist nicht die zuverlässigste Methode, da sie eine falsche zurückgibt,True
wenn die aktuell installierte Version0.2.3
die neueste Version ist0.2.30
oder0.2.3a
. Eine Verbesserung wäre, programmgesteuert die neueste Version zu erhalten und einen direkten Vergleich durchzuführen.quelle
pip search
. Es verwendet eine veraltete XML-RPC-API, und manchmal sind die Suchergebnisse ungenau / falsch. Tatsächlich denke ich, dass sie möglicherweise bald entfernt werden, siehe Entfernen des Pip-Suchbefehls # 5216 .import gekko
und danncurrent_version=gekko.__version__
statt ein Wörterbuch aller Paketversionen zu erstellen. Allerdings haben nicht alle Pakete eine Versionsnummer, auf die im Paket zugegriffen werden kann.Letzte Version:
Mein Projekt
luddite
hat diese Funktion:Installierte Version:
Die kanonische Möglichkeit, die installierte Version zu überprüfen, besteht darin, auf das
__version__
Attribut des Namespace der obersten Ebene zuzugreifen :Leider setzen nicht alle Projekte dieses Attribut. Wenn dies nicht der Fall ist, können
pkg_resources
Sie es aus den Metadaten ausgraben:quelle
Dies sollte zumindest für Demozwecke ausreichen. Rufen Sie einfach
isLatestVersion
mit dem Namen des Pakets an, das Sie überprüfen möchten. Wenn Sie dies an einem wichtigen Ort verwenden, möchten Sie versuchen, die URL-Anfrage abzufangen, da der Internetzugang möglicherweise nicht verfügbar ist. Beachten Sie auch, dassisLatestVersion
False zurückgegeben wird , wenn das Paket nicht installiert ist.Dies wird für Python 3.7.4 und Pip 19.0.3 getestet.
quelle
pip._internal
ist keine öffentliche API. In den Dokumenten von pip wird sogar ausdrücklich davon abgeraten : " Sie dürfen die internen APIs von pip nicht auf diese Weise verwenden. "Es ist nicht schwer, selbst ein einfaches Skript zu schreiben, indem Sie die PyPI-API abfragen . Mit dem neuesten Python 3.8 ist es möglich, nur die Standardbibliothek zu verwenden (wenn Sie Python 3.7 oder älter verwenden, müssen Sie den
importlib_metadata
Backport installieren ):Anwendungsbeispiel:
Wenn Sie zufällig
packaging
installiert haben, ist dies eine bessere Alternative zumdistutils.version
Parsen von Versionen:wird
quelle