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

684

Ich habe gerade die Python-Module installiert: constructund statlibmit setuptoolsso:

# Install setuptools to be able to download the following
sudo apt-get install python-setuptools

# Install statlib for lightweight statistical tools
sudo easy_install statlib

# Install construct for packing/unpacking binary data
sudo easy_install construct

Ich möchte in der Lage sein, (programmgesteuert) ihre Versionen zu überprüfen. Gibt es ein Äquivalent zu python --versionIch kann über die Befehlszeile ausgeführt werden?

Meine Python-Version ist 2.7.3.

Tarabyte
quelle
6
Mögliches Duplikat der Überprüfung der Python-Modulversion zur Laufzeit
Ciro Santilli 6 病毒 审查 六四.
12
Für diejenigen, die an einer Befehlszeilenlösung interessiert sind, verwenden Sie:pip list
KrisWebDev

Antworten:

726

Ich schlage vor, pip anstelle von easy_install zu verwenden . Mit pip können Sie alle installierten Pakete und deren Versionen mit auflisten

pip freeze

In den meisten Linux-Systemen können Sie dies an grep(oder findstrunter Windows) weiterleiten, um die Zeile für das bestimmte Paket zu finden, an dem Sie interessiert sind:

Linux:
$ pip freeze | grep lxml
lxml==2.3

Windows:
c:\> pip freeze | findstr lxml
lxml==2.3

Für ein einzelnes Modul können Sie das __version__Attribut ausprobieren , es gibt jedoch Module ohne dieses Attribut :

$ python -c "import requests; print(requests.__version__)"
2.14.2
$ python -c "import lxml; print(lxml.__version__)"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: 'module' object has no attribute '__version__'

Da den Befehlen in Ihrer Frage das Präfix vorangestellt ist sudo, scheint es, dass Sie in der globalen Python-Umgebung installieren. Es wird dringend empfohlen , einen Blick in die virtuellen Umgebungsmanager von Python zu werfen , z. B. in virtualenvwrapper

alko
quelle
18
eine Antwort unten vorgeschlagen pip show lxml | grep Version; Dies läuft viel schneller, da nur ein einziges Paket überprüft wird.
Jonathan Vanasco
12
Nur der Vollständigkeit pip list | grep lxml
halber
3
Wie wäre es auf einem Windows-System? Was ist das grepin Windows? Da Pip einfrieren | grep lxml funktioniert nicht bei Windwos.
Raven Cheuk
4
@ RavenCheuk verwendenpip list | findstr lxml
Alex F
2
Windows-Variante mit Find (1 Zeichen kürzer ...): Pip-Liste | find "lxml"
Jordan Stefanelli
366

Du kannst es versuchen

>>> import statlib
>>> print statlib.__version__

>>> import construct
>>> print contruct.__version__
damienfrancois
quelle
59
Einige Versionen einiger gängiger Bibliotheken (z. B. inspect) haben __version__leider kein Attribut.
Ely
5
PySerial hat serial.VERSION. Vielleicht gibt es auch einige andere häufig verwendete Module, die PEP 0396 nicht folgen: python.org/dev/peps/pep-0396
Sussch
6
Viele Module haben keine Version
sdaffa23fdsf
1
@ sdaffa23fdsf Welche Module haben keine Version? Mehr als seriell, inspizieren, PyQt und SQLite? Siehe pycmake .
Pål GD
4
print(contruct.__version__)bei Verwendung von Python 3. *
Jacanterbury
216

Verwenden Sie ein pkg_resourcesmit der setuptoolsBibliothek verteiltes Modul . Beachten Sie, dass die Zeichenfolge, die Sie an die get_distributionMethode übergeben, dem PyPI-Eintrag entsprechen sollte.

>>> import pkg_resources
>>> pkg_resources.get_distribution("construct").version
'2.5.2'

und wenn Sie es über die Befehlszeile ausführen möchten, können Sie Folgendes tun:

python -c "import pkg_resources; print(pkg_resources.get_distribution('construct').version)"

Beachten Sie, dass die Zeichenfolge, die Sie an die get_distributionMethode übergeben, der in PyPI registrierte Paketname und nicht der Modulname sein sollte, den Sie importieren möchten.

Leider sind diese nicht immer gleich (zB du pip install memcachedaber import memcache).

Jakub Kukul
quelle
19
Dies funktioniert auch dann, wenn das Modul nicht über das Attribut verfügt __version__.
Imranal
Was ist damit? construct.version.full_version
MKatleast3
8
Sollte die beste Antwort sein, ist dies der einzige zuverlässige Weg, um die Paketversion zu erhalten (falls es eine gibt)
henryJack
7
Beachten Sie, dass pkg_resources.get_distrinbutiondies auch nicht immer funktioniert. Es gibt eine DistributionNotFoundAusnahme mit der folgenden Fehlermeldung: "Die Verteilung 'the_package_name' wurde nicht gefunden und wird von der Anwendung benötigt"
mjv
2
@mjv Ihr Fehler tritt höchstwahrscheinlich auf, weil 1) das Paket nicht installiert ist 2) Sie einen get_distribution
Modulnamen
96

Ich denke, das kann helfen, aber zuerst das showPaket installieren , um es auszuführen, pip showdann mit show die Version finden!

sudo pip install show
# in order to get package version execute the below command
sudo pip show YOUR_PACKAGE_NAME | grep Version
0x3bfc
quelle
2
Keine Freude hier! pip: error: No command by the name pip show (maybe you meant "pip install show")
Sam Finnigan
Diese Antwort ist nur dann wirklich geeignet, wenn Sie eine Paketversion aus der Shell benötigen. Wenn Sie es in Python benötigen, wäre dies ein ziemlich schlechter Hack. Auf jeden Fall können Sie den folgenden Befehl verwenden, um die Version zu extrahieren : pip show PACKAGE | awk '/^Version: / {sub("^Version: ", ""); print}'. Sie könnten wahrscheinlich mit einem einfacheren AWK-Skript davonkommen, aber das oben Genannte ist für alle Randfälle sicherer.
Sechs
3
@SamFinnigan pip showwurde in Pip 1.2.1.post1 implementiert . Sie verwenden eine schrecklich veraltete Version von pip, also kein Wunder, dass Sie Probleme haben! Ich verwende derzeit Pip 7.1.2 . Wenn Sie durch etwas nicht aktualisiert werden können, können Sie es jederzeit lokal oder in einer virtuellen Umgebung installieren.
Sechs
hat für mich gearbeitet danke. Einige der Packeges haben nicht den Parameter .__ version__, so dass einer nützlicher ist.
Salih Karagoz
Ich scheine eine Diskrepanz in der Ausgabe zu bekommen: >> print (sklearn .__ version__) #returns 0.20.3 >> pip show sklearn #return 0.0; könntest Du das erläutern?
Sumanth Lazarus
76

Der bessere Weg, dies zu tun, ist:


Einzelheiten zu einem bestimmten Paket

pip show <package_name>

Es enthält Angaben zu Paketname, Version, Autor, Speicherort usw.


$ pip show numpy
Name: numpy
Version: 1.13.3
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@python.org
License: BSD
Location: c:\users\prowinjvm\appdata\local\programs\python\python36\lib\site-packages
Requires:

Für mehr Details: >>> pip help


pip sollte aktualisiert werden, um dies zu tun.

pip install --upgrade pip

Unter Windows empfiehlt der Befehl:

python -m pip install --upgrade pip

susan097
quelle
Ich scheine eine Diskrepanz in der Ausgabe zu bekommen: >> print (sklearn .__ version__) #returns 0.20.3 >> pip show sklearn #return 0.0; könntest Du das erläutern?
Sumanth Lazarus
1
Sie sollten pip show scikit-learnanstelle von verwenden pip show sklearn. sklearn ist eine Kurzform, die während des Imports verwendet wird und nicht direkt erkannt wird, pipda scikit-learndas vollständige Paket nicht gelernt wirdsklearn
susan097
42

In Python3 mit Klammern um den Druck

>>> import celery
>>> print(celery.__version__)
3.1.14
user224767
quelle
30
Nicht jedes Paket hat ein __version__Attribut.
Spedwards
Diese Antwort bezieht sich auf Python 3 - eine andere Sprache. Sie können diese Antwort jedoch in Python 2 verwenden. Dazu müssen Sie vor den anderen Anweisungen die Zeile "from future import print_function" hinzufügen .
user1976
1
@ user1976 Dies ist auch in Python 2 eine gültige Syntax. Die Klammern werden einfach um das Argument herum toleriert print, genau wie (2)+(3)bei 5. Wenn Sie ein Komma in Klammern haben, werden die Dinge möglicherweise etwas interessanter, obwohl printes irgendwie immer noch funktioniert.
Tripleee
22

module.__version__ ist ein guter erster Versuch, aber es funktioniert nicht immer.

Wenn Sie nicht berappen möchten und Pip 8 oder 9 verwenden, können Sie dennoch pip.get_installed_distributions()Versionen aus Python abrufen:

Update: Die Lösung funktioniert hier in Pip 8 und 9, aber in Pip 10 wurde die Funktion von pip.get_installed_distributionsnach verschoben , pip._internal.utils.misc.get_installed_distributionsum explizit anzuzeigen, dass sie nicht für den externen Gebrauch bestimmt ist. Es ist keine gute Idee, sich darauf zu verlassen, wenn Sie pip 10+ verwenden.

import pip

pip.get_installed_distributions()  # -> [distribute 0.6.16 (...), ...]

[
    pkg.key + ': ' + pkg.version
    for pkg in pip.get_installed_distributions()
    if pkg.key in ['setuptools', 'statlib', 'construct']
] # -> nicely filtered list of ['setuptools: 3.3', ...]
wasserdicht
quelle
1
Ja, nicht alle Paketersteller legen die Version fest , aber wenn Sie sie verwenden pip, sollte dies immer funktionieren.
wasserdicht
2
Leider ist diese Lösung nicht realisierbar. Pip garantiert keine In-Process-API, sondern nur eine API über die Befehlszeile. Dieser Ansatz funktioniert nicht mehr auf Pip 10.
Jason R. Coombs
16

Die vorherigen Antworten haben mein Problem nicht gelöst, aber dieser Code hat:

import sys 
for name, module in sorted(sys.modules.items()): 
  if hasattr(module, '__version__'): 
    print name, module.__version__ 
Taschuhka
quelle
2
Dies vermeidet nur den Versuch zu drucken, __version__wenn es nicht definiert ist. Wenn dies nicht __version__der Fall ist , erhalten Sie für das gewünschte Paket kein Ergebnis.
Tripleee
Wenn das Modul kein __version__Standardattribut hat ( python.org/dev/peps/pep-0396/#specification ), ist es ohne manuelle Untersuchung unmöglich zu wissen, wo und wie die Version enthalten ist.
Taschuhka
12

Sie können hierfür die importlib_metadataBibliothek verwenden.

Wenn Sie auf Python sind <3.8, installieren Sie es zuerst mit:

pip install importlib_metadata

Seit Python ist 3.8es in der Standardbibliothek enthalten.

Um dann die Version eines Pakets (in diesem Beispiel lxml) zu überprüfen, führen Sie Folgendes aus :

>>> from importlib_metadata import version
>>> version('lxml')
'4.3.1'

Beachten Sie, dass dies nur für Pakete funktioniert, die über PyPI installiert wurden. Außerdem müssen Sie der versionMethode einen Paketnamen als Argument übergeben und nicht einen Modulnamen, den dieses Paket bereitstellt (obwohl diese normalerweise identisch sind).

Jakub Kukul
quelle
12

Verwenden dir()Sie diese Option , um herauszufinden, ob das Modul überhaupt ein __version__Attribut hat.

>>> import selenium
>>> dir(selenium)
['__builtins__', '__doc__', '__file__', '__name__',
 '__package__', '__path__', '__version__']
>>> selenium.__version__
'3.141.0'
>>> selenium.__path__
['/venv/local/lib/python2.7/site-packages/selenium']
jturi
quelle
Genau ich habe nach Selenium Version gesucht - und magisch hier haben wir es! Funktioniert mit Python3 also - gute Arbeit!
Pbaranski
Dies kommt einer robusten Lösung am nächsten
D Adams
6

Wenn die oben genannten Methoden nicht funktionieren, sollten Sie in Python Folgendes ausprobieren:

import modulename

modulename.version
modulename.version_info

Siehe Python Tornado-Version herunterladen?

Beachten Sie, dass das .versionfür mich neben dem Tornado auch bei einigen anderen funktioniert hat.

D Adams
quelle
6

Fügen Sie zuerst Python und Pip zu Ihren Umgebungsvariablen hinzu. damit Sie Ihre Befehle an der Eingabeaufforderung ausführen können. Geben Sie dann einfach den Python- Befehl. Importieren Sie dann das Paket

->import scrapy

Drucken Sie dann den Versionsnamen

->print(scrapy.__version__)

Das wird definitiv funktionieren

suraj garla
quelle
2
Wie hier mehrfach erläutert, bietet nicht jedes Modul ein __version__Attribut.
Reox
Ich habe ein Paket gefunden, das nicht pip freezeangezeigt wird, jedoch hat <Paket> .__ version_ funktioniert. Danke fürs Schreiben.
Timothy C. Quinn
6

Angenommen, wir verwenden Jupyter Notebook (wenn Sie Terminal verwenden, lassen Sie die Ausrufezeichen fallen):

1) wenn das Paket (zB xgboost) mit pip installiert wurde :

!pip show xgboost
!pip freeze | grep xgboost
!pip list | grep xgboost

2) wenn das Paket (zB caffe) mit conda installiert wurde :

!conda list caffe
user10429366
quelle
5

Einige Module haben keine __version__Attribute, daher ist es am einfachsten, das Terminal einzuchecken:pip list

Yuchao Jiang
quelle
5

In der Python 3.8-Version gibt es ein neues metadataModul im importlibPaket, das dies ebenfalls kann.

Hier ist ein Beispiel aus Dokumenten:

>>> from importlib.metadata import version
>>> version('requests')
'2.22.0'
Davit Tovmasyan
quelle
Diese Methode hat den Vorteil, dass sie funktioniert, wenn das Versionsattribut nicht definiert ist.
Dereckson
3

Ich schlage vor, eine pythonShell im Terminal zu öffnen (in der Python-Version, die Sie interessiert), die Bibliothek zu importieren und ihr __version__Attribut abzurufen.

>>> import statlib
>>> statlib.__version__

>>> import construct
>>> contruct.__version__

Anmerkung 1: Wir müssen die Python-Version berücksichtigen . Wenn wir verschiedene Versionen von Python installiert haben, müssen wir das Terminal in der Python-Version öffnen, an der wir interessiert sind. Wenn Sie beispielsweise das Terminal mit python3.8can öffnen (wird dies sicherlich tun ), erhalten Sie eine andere Version einer Bibliothek als mit python3.5oder python2.7.

Hinweis 2: Wir vermeiden die Verwendung der printFunktion , da ihr Verhalten von Python2 oder Python3 abhängt. Wir brauchen es nicht, das Terminal zeigt den Wert des Ausdrucks an.

geliebt von Jesus
quelle
2

Dies funktioniert auch in Jupyter Notebook unter Windows! Solange Jupyter über eine Bash-kompatible Befehlszeile wie Git Bash (MingW64) gestartet wird, können die in vielen Antworten angegebenen Lösungen mit einem winzigen Tweak in Jupyter Notebook auf Windows-Systemen verwendet werden.

Ich verwende Windows 10 Pro mit Python, das über Anaconda installiert ist, und der folgende Code funktioniert, wenn ich Jupyter über Git Bash starte (jedoch nicht, wenn ich über die Anaconda-Eingabeaufforderung starte).

Die Optimierung: Fügen Sie ein Ausrufezeichen ( !) vor pip, um es zu machen !pip.

>>>!pip show lxml | grep Version
Version: 4.1.0

>>>!pip freeze | grep lxml
lxml==4.1.0

>>>!pip list | grep lxml
lxml                               4.1.0                  

>>>!pip show lxml
Name: lxml
Version: 4.1.0
Summary: Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API.
Home-page: http://lxml.de/
Author: lxml dev team
Author-email: lxml-dev@lxml.de
License: BSD
Location: c:\users\karls\anaconda2\lib\site-packages
Requires: 
Required-by: jupyter-contrib-nbextensions
Karl Baker
quelle
2

Schnell Python - Programm alle packges zur Liste (Sie können es kopieren requirements.txt )

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 folgendermaßen aussehen:

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

(Siehe auch https://stackoverflow.com/a/56912280/7262247 )

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

  • eingebaute Module
  • Module nicht installiert, sondern nur zum Python-Pfad hinzugefügt (z. B. von Ihrer IDE)
  • zwei Versionen desselben Moduls verfügbar (eine im Python-Pfad ersetzt die installierte)

Da wir einen zuverlässigen Weg , um die Version des benötigten jedes Paket, Modul oder Submodul, landete ich schriftlich bis getversion . Es ist ganz einfach zu bedienen:

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

Einzelheiten finden Sie in der Dokumentation .

smarie
quelle
1

So erhalten Sie eine Liste der nicht standardmäßigen (Pip-) Module, die in das aktuelle Modul importiert wurden:

[{pkg.key : pkg.version} for pkg in pip.get_installed_distributions() 
   if pkg.key in set(sys.modules) & set(globals())]

Ergebnis:

>>> import sys, pip, nltk, bs4
>>> [{pkg.key : pkg.version} for pkg in pip.get_installed_distributions() if pkg.key in set(sys.modules) & set(globals())]
[{'pip': '9.0.1'}, {'nltk': '3.2.1'}, {'bs4': '0.0.1'}]

Hinweis:

Dieser Code wurde aus Lösungen auf dieser Seite und aus Wie werden importierte Module aufgelistet?

Tobias Bleisch
quelle
1

Zusammenfassend:

conda list   

(Es werden alle Bibliotheken zusammen mit Versionsdetails bereitgestellt).

Und:

pip show tensorflow

(Es gibt vollständige Bibliotheksdetails).

Tej
quelle
0

Aufbauend auf Jakub Kukuls Antwort fand ich einen zuverlässigeren Weg, um dieses Problem zu lösen.

Das Hauptproblem dieses Ansatzes besteht darin, dass die Pakete "konventionell" installiert werden müssen (und dies schließt die Verwendung nicht ein pip install --user ) oder sich bei der Python-Initialisierung im Systempfad befinden müssen.

Um das zu umgehen, können Sie verwenden pkg_resources.find_distributions(path_to_search). Dies sucht im Wesentlichen nach Distributionen, die importierbar wären, wenn sie path_to_searchsich im Systempfad befänden.

Wir können diesen Generator folgendermaßen durchlaufen:

avail_modules = {}
distros = pkg_resources.find_distributions(path_to_search)
for d in distros:
    avail_modules[d.key] = d.version

Dies gibt ein Wörterbuch mit Modulen als Schlüssel und deren Version als Wert zurück. Dieser Ansatz kann auf viel mehr als die Versionsnummer erweitert werden.

Vielen Dank an Jakub Kukul für den Hinweis in die richtige Richtung

Alessio Arena
quelle
0

Schreiben dieser Antwort für Windows-Benutzer. Wie in allen anderen Antworten vorgeschlagen, können Sie die Anweisungen wie folgt verwenden:

import [type the module name]
print(module.__version__)      # module + '.' + double underscore + version + double underscore

Es gibt jedoch einige Module, die ihre Version auch nach Verwendung der oben beschriebenen Methode nicht drucken. Sie können also einfach Folgendes tun:

  1. Öffnen Sie die Eingabeaufforderung.
  2. Navigieren Sie mit cd [ Dateiadresse] zu der Dateiadresse / dem Dateiverzeichnis, in der Sie Ihren Python und alle unterstützenden Module installiert haben.
  3. Verwenden Sie den Befehl " pip install [Modulname] " und drücken Sie die Eingabetaste.
  4. Daraufhin wird die Meldung " Anforderung bereits erfüllt: Dateiadresse \ Ordnername (mit Version) " angezeigt .
  5. Siehe den Screenshot unten zum Beispiel: Ich musste die Version eines vorinstallierten Moduls mit dem Namen "Selenium-Screenshot" kennen. Es zeigte mir richtig als 1.5.0:

Screenshot der Eingabeaufforderung

lousycoder
quelle
0

Sie können dies versuchen:

pip list

Dadurch werden alle Pakete mit ihren Versionen ausgegeben. Ausgabe

CRBelhekar
quelle
-1

Sie können zuerst ein solches Paket installieren und dann dessen Version überprüfen

pip install package
import package
print(package.__version__)

es sollte Ihnen Paketversion geben

Shaina Raza
quelle