1103 Stimmen

Wie überprüfe ich die Versionen von Python-Modulen?

Ich habe die Python-Module construct und statlib mit setuptools installiert:

sudo apt-get install python-setuptools

sudo easy_install statlib
sudo easy_install construct

Wie kann ich ihre Versionen über die Befehlszeile überprüfen?

4voto

Carl Boneri Punkte 2509

Nachdem ich das Internet durchforstet hatte und versuchte herauszufinden, wie ich die Version eines Moduls sicherstellen kann, das ich verwende (anscheinend ist python_is_horrible.__version__ in Python 2 kein Ding?), über verschiedene Betriebssysteme und Python-Versionen hinweg... funktionierte buchstäblich keine dieser Antworten für mein Szenario...

Dann dachte ich einen Moment darüber nach und erkannte die Grundlagen... nach etwa 30 Minuten des Scheiterns...

geht davon aus, dass das Modul bereits installiert und importiert werden kann


Python 3.7

>>> import sys,sqlite3
>>> sys.modules.get("sqlite3").version
'2.6.0'
>>> ".".join(str(x) for x in sys.version_info[:3])
'3.7.2'

Python 2.7

>>> import sys,sqlite3
>>> sys.modules.get("sqlite3").version
'2.6.0'
>>> ".".join(str(x) for x in sys.version_info[:3])
'2.7.11'

Buchstäblich das ist es...

2voto

smarie Punkte 3528

(Siehe auch Wie bekomme ich die Version eines installierten Moduls in Python programmgesteuert?)

Ich fand es ziemlich unzuverlässig, die verschiedenen verfügbaren Tools zu verwenden (einschließlich des besten pkg_resources, wie von der Antwort von Jakub Kukul' erwähnt), da die meisten von ihnen nicht alle Fälle abdecken. Zum Beispiel

  • eingebaute Module
  • Module, die nicht installiert, sondern nur zum Python-Pfad hinzugefügt wurden (zum Beispiel von Ihrem IDE)
  • zwei Versionen desselben Moduls verfügbar (eine im Python-Pfad, die die installierte überschreitet)

Weil wir eine zuverlässige Möglichkeit brauchten, die Version von irgend einem Paket, Modul oder Submodul zu erhalten, habe ich getversion geschrieben. Es ist ziemlich einfach zu bedienen:

from getversion import get_module_version
import foo
version, details = get_module_version(foo)

Siehe die Dokumentation für Details.

2voto

Yarh Punkte 895

Ein Python-Programm, um alle Pakete aufzulisten (Sie können es in die Datei requirements.txt kopieren):

from pip._internal.utils.misc import get_installed_distributions
print_log = ''
for module in sorted(get_installed_distributions(), key=lambda x: x.key):
    print_log +=  module.key + '~=' + module.version  + '\n'
print(print_log)

Die Ausgabe würde so aussehen:

asn1crypto~=0.24.0
attrs~=18.2.0
automat~=0.7.0
beautifulsoup4~=4.7.1
botocore~=1.12.98

2voto

renatodamas Punkte 11458

Für Situationen, in denen das Feld __version__ nicht definiert ist:

try:
    from importlib import metadata
except ImportError:
    import importlib_metadata as metadata # python<=3.7

metadata.version("package")

Alternativ, wie bereits erwähnt:

import pkg_resources
pkg_resources.get_distribution('package').version

1voto

Majte Punkte 199

Ich selbst arbeite in einer stark eingeschränkten Serverumgebung und leider funktionieren keine der Lösungen hier für mich. Es gibt möglicherweise keine global gültige Lösung, die für alle passt, aber ich habe einen schnellen Workaround gefunden, indem ich den Terminalausgabewert von "pip freeze" in meinem Skript gelesen und die Modulbezeichnungen und -versionen in einem Wörterbuch gespeichert habe.

import os
os.system('pip freeze > tmpoutput')
with open('tmpoutput', 'r') as f:
    modules_version = f.read()

module_dict = {item.split("==")[0]:item.split("==")[-1] for item in modules_versions.split("\n")}

Rufen Sie die Versionen Ihrer Module ab, indem Sie den Modulbezeichnungsschlüssel übergeben, z.B.:

>>  module_dict["seaborn"]
'0.9.0'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X