Jak sprawdzić wersję modułów python?

686

Właśnie zainstalowałem moduły Pythona: constructi statlibw setuptoolsten sposób:

# 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

Chcę mieć możliwość (programowego) sprawdzenia ich wersji. Czy istnieje odpowiednik, który python --versionmożna uruchomić z wiersza polecenia?

Moja wersja Pythona to 2.7.3.

tarabajt
źródło
6
możliwy duplikat Sprawdzanie wersji modułu python w czasie wykonywania
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
12
Dla osób zainteresowanych rozwiązaniem z linii poleceń, użyj:pip list
KrisWebDev

Odpowiedzi:

728

Sugeruję użycie pip zamiast easy_install . Za pomocą pip możesz wyświetlić listę wszystkich zainstalowanych pakietów i ich wersji

pip freeze

W większości systemów linuxowych możesz to potokować grep(lub findstrw systemie Windows), aby znaleźć wiersz dla konkretnego pakietu, który Cię interesuje:

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

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

W przypadku pojedynczego modułu możesz wypróbować ten __version__atrybut , jednak istnieją moduły bez niego:

$ 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__'

Wreszcie, ponieważ polecenia w twoim pytaniu są poprzedzone prefiksem sudo, wygląda na to, że instalujesz się w globalnym środowisku python. Zdecydowanie zalecamy przyjrzenie się menedżerom środowiska wirtualnego Pythona , na przykład virtualenvwrapper

alk
źródło
18
sugerowana odpowiedź poniżej pip show lxml | grep Version; będzie działać znacznie szybciej, ponieważ sprawdza tylko jedną paczkę.
Jonathan Vanasco,
12
Dla kompletności: trzecia wersja topip list | grep lxml
0xAffe
3
Co powiesz na system Windows? Co to jest grepw oknach? Od momentu zamrożenia pip | grep lxml nie działa na windwos.
Raven Cheuk
4
Wykorzystanie @RavenCheukpip list | findstr lxml
Alex F
2
wariant Windows z find (1 znak krótszy ...): lista pip | znajdź „lxml”
Jordan Stefanelli,
367

Możesz spróbować

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

>>> import construct
>>> print contruct.__version__
damienfrancois
źródło
59
Niestety, niektóre wersje niektórych popularnych bibliotek (takich jak inspect) nie mają __version__atrybutu.
ely
5
PySerial ma serial.VERSION. Być może istnieją też inne powszechnie używane moduły, które nie są zgodne z PEP 0396: python.org/dev/peps/pep-0396
Sussch
6
wiele modułów nie ma wersji
sdaffa23fdsf
1
@ sdaffa23fdsf które moduły nie mają wersji? Więcej niż serial, inspekcja, PyQt i SQLite? Zobacz pycmake .
Pål GD
4
print(contruct.__version__)jeśli używasz Python 3. *
jacanterbury,
218

Użyj pkg_resourcesmodułu dystrybuowanego z setuptoolsbiblioteką. Zauważ, że ciąg przekazywany do get_distributionmetody powinien odpowiadać wpisowi PyPI.

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

a jeśli chcesz uruchomić go z wiersza poleceń, możesz:

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

Zauważ, że ciąg, który przekazujesz do get_distribution metody powinien być nazwą pakietu zarejestrowaną w PyPI, a nie nazwą modułu, który próbujesz zaimportować.

Niestety nie zawsze są takie same (np. Robisz to pip install memcached, ale import memcache).

Jakub Kukul
źródło
20
Działa to nawet wtedy, gdy moduł nie ma atrybutu __version__.
imranal
A co z tym? construct.version.full_version
MKatleast3
9
Powinna być najlepsza odpowiedź, jest to jedyny niezawodny sposób na uzyskanie wersji pakietu (jeśli istnieje)
henryJack
7
Pamiętaj, że pkg_resources.get_distrinbutionnie zawsze też działa. Występuje DistributionNotFoundwyjątek z komunikatem o błędzie, takim jak: „Nie znaleziono dystrybucji„ nazwa_pakietu ”i jest ona wymagana przez aplikację”
mjv
3
@mjv Twój błąd najprawdopodobniej występuje, ponieważ 1) pakiet nie został zainstalowany 2) przekazujesz nazwę metody zamiast nazwy pakietu do get_distributionmetody
Jakub Kukul
96

Myślę, że to może pomóc, ale najpierw zainstaluj showpakiet, aby uruchomić, pip showa następnie użyj show, aby znaleźć wersję!

sudo pip install show
# in order to get package version execute the below command
sudo pip show YOUR_PACKAGE_NAME | grep Version
0x3bfc
źródło
2
Tu nie ma radości! pip: error: No command by the name pip show (maybe you meant "pip install show")
Sam Finnigan,
Ta odpowiedź jest naprawdę odpowiednia tylko wtedy, gdy potrzebujesz wersji pakietu z powłoki. Jeśli potrzebujesz go w Pythonie, byłby to całkiem zły hack. Tak czy inaczej, można użyć następującego polecenia, aby wyodrębnić wersji: pip show PACKAGE | awk '/^Version: / {sub("^Version: ", ""); print}'. Prawdopodobnie możesz uciec z prostszym skryptem AWK, ale wyżej wspomniane będzie bezpieczniejsze dla wszelkich przypadków krawędzi.
Sześć
3
@SamFinnigan pip showzostał zaimplementowany w pip 1.2.1.post1 . Używasz strasznie przestarzałej wersji pipa, więc nic dziwnego, że masz problemy! Obecnie korzystam z pip 7.1.2 . Jeśli coś uniemożliwia aktualizację, zawsze możesz po prostu zainstalować ją lokalnie lub w virtualenv.
Sześć
pracował dla mnie dzięki. niektóre pakiety nie mają parametru .__ wersja__, więc jeden jest bardziej przydatny.
Salih Karagoz
Wydaje mi się, że otrzymuję rozbieżność w wynikach: >> print (sklearn .__ version__) #returns 0.20.3 >> pip show sklearn #return 0.0; możesz wyjaśnić?
Sumanth Lazarus
76

Lepszym sposobem na to jest:


Szczegółowe informacje na temat konkretnego pakietu

pip show <package_name>

Wyszczególnia nazwę pakietu, wersję, autora, lokalizację itp.


$ 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:

Po więcej szczegółów: >>> pip help


pip należy zaktualizować, aby to zrobić.

pip install --upgrade pip

W systemie Windows zalecane polecenie to:

python -m pip install --upgrade pip

susan097
źródło
Wydaje mi się, że otrzymuję rozbieżność w wynikach: >> print (sklearn .__ version__) #returns 0.20.3 >> pip show sklearn #return 0.0; możesz wyjaśnić?
Sumanth Lazarus
1
Powinieneś użyć pip show scikit-learnzamiast pip show sklearn. sklearn jest krótką formą używaną podczas importu, nie rozpoznaje się bezpośrednio, pipponieważ scikit-learnjest to pełny pakiet, nie ucz sięsklearn
susan097
42

W python3 z nawiasami wokół wydruku

>>> import celery
>>> print(celery.__version__)
3.1.14
użytkownik224767
źródło
30
Nie każda paczka ma __version__atrybut.
Spedwards
Ta odpowiedź dotyczy Pythona 3 - który jest innym językiem. Jednak możesz użyć tej odpowiedzi w Pythonie 2. Aby to zrobić, musisz dodać wiersz: „z przyszłego importu print_function”, przed innymi instrukcjami.
user1976,
1
@ user1976 Jest to również poprawna składnia w Pythonie 2. Nawiasy są po prostu tolerowane wokół argumentu print, podobnie jak (2)+(3)ewaluuje 5. Kiedy w nawiasach znajduje się przecinek, rzeczy mogą stać się nieco bardziej interesujące, choć printnadal działa.
tripleee
22

module.__version__ jest dobrą pierwszą rzeczą do wypróbowania, ale nie zawsze działa.

Jeśli nie chcesz używać powłoki, a używasz pip 8 lub 9, nadal możesz używać pip.get_installed_distributions()do pobierania wersji z poziomu Pythona:

aktualizować: rozwiązanie tutaj pracuje w pip 8 i 9, ale w pip 10 funkcja została przeniesiona z pip.get_installed_distributionsaby pip._internal.utils.misc.get_installed_distributionswyraźnie wskazać, że nie jest do użytku zewnętrznego. Nie należy polegać na tym, jeśli używasz pip 10+.

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', ...]
wodoodporny
źródło
1
Tak, nie wszyscy twórcy pakietów ustawiają wersję , ale jeśli używasz pip, to powinno zawsze działać.
wodoodporny
2
Niestety to rozwiązanie nie jest wykonalne. Pip nie gwarantuje interfejsu API w trakcie procesu, tylko interfejs API za pośrednictwem wiersza polecenia. To podejście nie działa już na pip 10.
Jason R. Coombs
16

Poprzednie odpowiedzi nie rozwiązały mojego problemu, ale ten kod:

import sys 
for name, module in sorted(sys.modules.items()): 
  if hasattr(module, '__version__'): 
    print name, module.__version__ 
tashuhka
źródło
2
Pozwala to po prostu uniknąć próby drukowania, __version__jeśli nie jest zdefiniowana. Jeżeli nie ma__version__ , nie otrzymasz żadnego wyniku dla żądanego pakietu.
tripleee
Jeśli moduł nie ma __version__atrybutu, który jest standardem ( python.org/dev/peps/pep-0396/#specification ), nie jest możliwe ustalenie , gdzie i jak jest uwzględniona wersja bez ręcznego sprawdzenia.
tashuhka
12

Możesz importlib_metadatado tego użyć biblioteki.

Jeśli korzystasz z Pythona <3.8, najpierw zainstaluj go za pomocą:

pip install importlib_metadata

Ponieważ python 3.8jest zawarty w standardowej bibliotece.

Następnie, aby sprawdzić wersję pakietu (w tym przykładzie lxml) uruchom:

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

Należy pamiętać, że działa to tylko w przypadku pakietów zainstalowanych z PyPI. Ponadto należy przekazać nazwę versionmetody jako argument do metody, a nie nazwę modułu podaną przez ten pakiet (chociaż zwykle są one takie same).

Jakub Kukul
źródło
12

Użyj, dir()aby dowiedzieć się, czy moduł ma __version__w ogóle atrybut.

>>> 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
źródło
Dokładnie szukałem wersji Selenium - i magicznie tutaj mamy! Działa z Python3, więc - dobra robota!
pbarański
jest to najbliższe solidnemu rozwiązaniu
D Adams
6

Jeśli powyższe metody nie działają, warto wypróbować następujące opcje w pythonie:

import modulename

modulename.version
modulename.version_info

Zobacz Uzyskaj wersję Python Tornado?

Uwaga, .versiondziałało dla mnie także na kilka innych oprócz tornado.

D Adams
źródło
6

najpierw dodaj Python, pip do zmiennych środowiskowych. abyś mógł wykonywać polecenia z wiersza poleceń. następnie po prostu wydaj polecenie python . następnie zaimportuj pakiet

->import scrapy

następnie wydrukuj nazwę wersji

->print(scrapy.__version__)

To na pewno zadziała

suraj garla
źródło
2
jak wielokrotnie omawiano tutaj, nie każdy moduł zawiera __version__atrybut.
reox
Znalazłem pakiet, który nie wyświetla się, pip freezejednak <pakiet> .__ wersja_ działało. Dzięki za wysłanie.
Timothy C. Quinn
6

Zakładając, że używamy Notatnika Jupyter (jeśli korzystasz z terminalu, upuść wykrzykniki):

1) jeśli pakiet (np. Xgboost) został zainstalowany za pomocą pip :

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

2) jeśli pakiet (np. Caffe ) został zainstalowany z conda :

!conda list caffe
użytkownik10429366
źródło
5

Niektóre moduły nie mają __version__atrybutu, więc najłatwiej jest sprawdzić w terminalu:pip list

Yuchao Jiang
źródło
5

W wersji Python 3.8 jest nowy metadatamoduł w importlibpakiecie, który również może to zrobić.

Oto przykład z dokumentów:

>>> from importlib.metadata import version
>>> version('requests')
'2.22.0'
Davit Tovmasyan
źródło
Ta metoda ma tę zaletę, że działa, gdy atrybut wersji nie jest zdefiniowany.
Dereckson,
3

Sugeruję otwarcie pythonpowłoki w terminalu (w wersji python, którą jesteś zainteresowany), zaimportowanie biblioteki i uzyskanie jej __version__atrybutu.

>>> import statlib
>>> statlib.__version__

>>> import construct
>>> contruct.__version__

Uwaga 1: Musimy wziąć pod uwagę wersję Pythona . Jeśli zainstalowaliśmy różne wersje Pythona, musimy otworzyć terminal w interesującej nas wersji Pythona. Na przykład otwarcie terminala za pomocą python3.8może (z pewnością da) inną wersję biblioteki niż otwarcie za pomocą python3.5lub python2.7.

Uwaga 2: Mamy unikać korzystania z printfunkcji , ponieważ jego zachowanie zależy python2 lub python3. Nie potrzebujemy tego, terminal pokaże wartość wyrażenia.

Lov.by.Jezus
źródło
2

Działa to również w Jupyter Notebook na Windowsie! Tak długo, jak Jupyter jest uruchamiany z wiersza poleceń zgodnego z bash, takiego jak Git Bash (MingW64), rozwiązania podane w wielu odpowiedziach mogą być używane w Jupyter Notebook w systemach Windows z jednym drobnym poprawieniem.

Korzystam z systemu Windows 10 Pro z Pythonem zainstalowanym za pośrednictwem Anacondy, a następujący kod działa, gdy uruchamiam Jupyter za pomocą Git Bash (ale nie działa, gdy uruchamiam z monitu Anaconda).

Ulepszenie: dodaj wykrzyknik ( !) przed, pipaby to zrobić !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
źródło
2

Szybki program pythonowy do listy wszystkich pakietów (możesz skopiować go do wymagań.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)

Dane wyjściowe wyglądałyby następująco:

asn1crypto~=0.24.0
attrs~=18.2.0
automat~=0.7.0
beautifulsoup4~=4.7.1
botocore~=1.12.98
Yarh
źródło
2

(patrz także https://stackoverflow.com/a/56912280/7262247 )

Uznałem, że używanie różnych dostępnych narzędzi (w tym najlepszego pkg_resourceswspomnianego przez Jakuba Kukula ) jest dość zawodne , ponieważ większość z nich nie obejmuje wszystkich przypadków . Na przykład

  • wbudowane moduły
  • moduły nie zostały zainstalowane, ale właśnie dodane do ścieżki Pythona (na przykład przez IDE)
  • dostępne są dwie wersje tego samego modułu (jedna w ścieżce Pythona zastępująca zainstalowaną)

Ponieważ potrzebowaliśmy niezawodnego sposobu na uzyskanie wersji dowolnego pakietu, modułu lub submodułu, napisałem getversion . Jest dość prosty w użyciu:

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

Szczegółowe informacje można znaleźć w dokumentacji .

smarie
źródło
1

Aby uzyskać listę niestandardowych modułów (pip) zaimportowanych do bieżącego modułu:

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

Wynik:

>>> 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'}]

Uwaga:

Ten kod został opracowany razem z rozwiązaniami zarówno na tej stronie, jak iz listy importowanych modułów?

Tobias Bleisch
źródło
1

W podsumowaniu:

conda list   

(Zapewni wszystkie biblioteki wraz ze szczegółami wersji).

I:

pip show tensorflow

(Daje pełne szczegóły biblioteki).

Tej
źródło
1

Możesz spróbować:

pip list

Spowoduje to wyświetlenie wszystkich pakietów wraz z ich wersjami. Wynik

CRBelhekar
źródło
0

Opierając się na odpowiedzi Jakuba Kukula znalazłem bardziej niezawodny sposób rozwiązania tego problemu.

Główny problem tego podejścia polega na tym, że pakiety muszą być instalowane „konwencjonalnie” (i nie obejmuje użycia pip install --user) lub znajdować się w systemie PATH przy inicjalizacji Pythona.

Aby się obejść, możesz użyć pkg_resources.find_distributions(path_to_search). To w zasadzie wyszukuje dystrybucje, które byłyby importowalne, gdyby path_to_searchznajdowały się w ŚCIEŻCE systemu.

Możemy iterować przez ten generator w następujący sposób:

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

Zwróci to słownik posiadający moduły jako klucze i ich wersję jako wartość. To podejście można rozszerzyć na znacznie więcej niż numer wersji.

Dziękujemy Jakubowi Kukulowi za wskazanie właściwego kierunku

Alessio Arena
źródło
0

Pisanie tej odpowiedzi dla użytkowników systemu Windows. Jak zasugerowano we wszystkich innych odpowiedziach, możesz użyć instrukcji jako:

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

Istnieją jednak moduły, które nie drukują swojej wersji nawet po zastosowaniu powyższej metody. Możesz więc po prostu:

  1. Otwórz wiersz polecenia.
  2. Przejdź do adresu / katalogu pliku, używając cd [ adres pliku ], w którym zainstalowałeś swój Python i wszystkie zainstalowane moduły wspierające.
  3. użyj polecenia „ pip install [nazwa modułu] ” i naciśnij enter.
  4. Wyświetli się komunikat „ Wymagania są już spełnione: adres pliku \ nazwa folderu (z wersją) ”.
  5. Zobacz na przykład zrzut ekranu poniżej: Musiałem znać wersję wstępnie zainstalowanego modułu o nazwie „Selenium-Screenshot”. Pokazał mi poprawnie jako 1.5.0:

zrzut ekranu wiersza polecenia

lousycoder
źródło
-1

możesz najpierw zainstalować taki pakiet, a następnie sprawdzić jego wersję

pip install package
import package
print(package.__version__)

powinien dać ci wersję pakietu

Shaina Raza
źródło