Python modüllerinin sürümü nasıl kontrol edilir?


687

Python modüllerini yeni kurdum: constructve statlibbununla setuptools:

# 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

Sürümlerini (programlı olarak) kontrol etmek istiyorum. python --versionKomut satırından çalıştırabileceğim bir eşdeğer var mı ?

Python sürümüm 2.7.3.




12
Bir komut satırı çözümü ile ilgilenenler için şunu kullanın:pip list
KrisWebDev

Yanıtlar:


730

Ben easy_install yerine pip kullanmanızı öneririz . Pip ile, kurulu tüm paketleri ve sürümlerini

pip freeze

Çoğu linux sisteminde, ilgilendiğiniz belirli bir pakete ilişkin satırı bulmak için bunu grep(veya findstrWindows'ta) birbirine bağlayabilirsiniz:

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

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

Tek bir modül için __version__özniteliği deneyebilirsiniz , ancak onsuz modüller vardır:

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

Son olarak, sorunuzdaki komutların önüne ön ek olarak sudo, genel python ortamına yüklediğiniz anlaşılıyor. Python sanal çevre yöneticilerine, örneğin virtualenvwrapper'a bakmanızı şiddetle tavsiye ederim


18
aşağıda bir cevap önerildi pip show lxml | grep Version; bu, yalnızca tek bir paketi incelediği için çok daha hızlı çalışacaktır.
Jonathan Vanasco

12
pip list | grep lxml
Tamlık

3
Windows sistemine ne dersiniz? Nedir greppencerelerde? Pip donmasından beri | grep lxml windwos üzerinde çalışmaz.
Raven Cheuk

4
@RavenCheuk kullanımıpip list | findstr lxml
Alex F

2
windows varyantla find (1 karakter daha kısa ...): pip listesi | "lxml" bulmak
Jordan Stefanelli

368

Deneyebilirsin

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

>>> import construct
>>> print contruct.__version__

59
Bazı ortak kütüphanelerin bazı sürümlerinin (örneğin inspect) __version__maalesef bir niteliği yoktur.
ely

5
PySerial var serial.VERSION. Belki de PEP 0396'yı
Sussch

6
bir çok modülün sürümü yok
sdaffa23fdsf

1
@ sdaffa23fdsf hangi modüllerin sürümü yok? Seri, inceleme, PyQt ve SQLite'den daha fazlası? Bkz pycmake .
Pål GD

4
print(contruct.__version__)Python 3 kullanıyorsanız. *
jacanterbury

218

Kütüphaneyle pkg_resourcesdağıtılan modülü kullanın setuptools. get_distributionYönteme ilettiğiniz dizenin PyPI girdisine karşılık gelmesi gerektiğini unutmayın.

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

ve komut satırından çalıştırmak istiyorsanız şunları yapabilirsiniz:

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

get_distributionYönteme ilettiğiniz dizenin , almaya çalıştığınız modül adı değil, PyPI'da kayıtlı paket adı olması gerektiğini unutmayın.

Ne yazık ki bunlar her zaman aynı değildir (örneğin pip install memcached, öyle import memcache).


20
Modül özniteliği olmasa bile bu çalışır __version__.
imranal

Peki buna ne dersin? construct.version.full_version
MKatleast3

9
En iyi cevap olmalı, paket sürümünü almanın tek güvenilir yolu (eğer varsa)
henryJack

7
Not pkg_resources.get_distrinbutionhep ya çalışmaz. DistributionNotFound"The_package_name 'dağıtımı bulunamadı ve uygulama tarafından gerekli" gibi hata mesajı ile bazı istisna yayınlar
mjv

3
@mjv büyük olasılıkla hata oluşur çünkü 1) paket yüklü değil 2) get_distributionyönteme paket adı yerine bir modül adı geçiriyorsunuz
Jakub Kukul

96

Sanırım bu yardımcı olabilir ama önce showçalıştırmak için paketi yüklemek pip showsonra sürümü bulmak için show kullanın!

sudo pip install show
# in order to get package version execute the below command
sudo pip show YOUR_PACKAGE_NAME | grep Version

2
Burada neşe yok! pip: error: No command by the name pip show (maybe you meant "pip install show")
Sam Finnigan

Bu cevap, yalnızca kabuktan bir paket sürümüne ihtiyacınız varsa gerçekten uygundur. Python içinde ihtiyacınız varsa, bu oldukça kötü bir hack olacaktır. Neyse, sürüm ayıklamak için aşağıdaki komutu kullanabilirsiniz: pip show PACKAGE | awk '/^Version: / {sub("^Version: ", ""); print}'. Muhtemelen daha basit bir AWK betiği ile kurtulabilirsiniz, ancak yukarıda belirtilen kenar durumları için daha güvenli olacaktır.
Altı

3
@SamFinnigan pip showhayata geçirildi pip 1.2.1.post1 . Çok korkunç bir pip sürümü kullanıyorsunuz, bu yüzden sorun yaşamanıza şaşmamalı! Şu anda pip 7.1.2 kullanıyorum . Bir şey güncellenmenizi engelliyorsa, her zaman yerel olarak veya bir sanal ağa yükleyebilirsiniz.
Altı

benim için çalıştı teşekkürler. bazı packeges değil .__ version__ parametresi vardır, böylece bir daha yararlı olur.
Salih Karagoz

Çıktıda bir tutarsızlık var gibi görünüyor: >> print (sklearn .__ version__) #returns 0.20.3 >> pip show sklearn #return 0.0; Açıklayabilir misin?
Sumanth Lazarus

76

Bunu yapmanın daha iyi yolu:


Belirli Paket detayları için

pip show <package_name>

Paket_adı, Sürüm, Yazar, Konum vb.


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

Daha fazla ayrıntı için: >>> pip help


pip bunun için güncellenmelidir.

pip install --upgrade pip

Windows'da tavsiye komutu:

python -m pip install --upgrade pip


Çıktıda bir tutarsızlık var gibi görünüyor: >> print (sklearn .__ version__) #returns 0.20.3 >> pip show sklearn #return 0.0; Açıklayabilir misin?
Sumanth Lazarus

1
Bunun pip show scikit-learnyerine kullanmalısınız pip show sklearn. sklearn ithalat sırasında kullanılan kısa bir formdur , tam paket öğrenmek değil pipberi doğrudan tanıyamazscikit-learnsklearn
susan097

42

Python3'te parantez içinde baskı

>>> import celery
>>> print(celery.__version__)
3.1.14

30
Her paketin bir __version__özelliği yoktur.
Spedwards

Bu cevap, farklı bir dil olan python 3 içindir. Ancak, bu cevabı python 2'de kullanabilirsiniz. Bunun için , diğer ifadelerden önce " gelecekteki import print_function'dan" satırının eklenmesi gerekir .
Kullanıcı1976

1
@ user1976 Bu, Python 2'de de geçerli bir sözdizimidir. Parantezler, printtıpkı (2)+(3)değerlendirdiği gibi , basitçe tolere edilir 5. Parantez içinde virgül olduğunda, işler biraz daha ilginç olabilir, ancak printyine de işe yarıyor.
tripleee

22

module.__version__ denemek için iyi bir ilk şey, ama her zaman işe yaramıyor.

Kabuk yapmak istemiyorsanız ve pip 8 veya 9 kullanıyorsanız, yine de pip.get_installed_distributions()Python içinden sürüm almak için kullanabilirsiniz :

güncelleme: buradaki çözüm 8 ve 9 numaralı piplerde çalışır, ancak pip 10'da bu fonksiyonpip.get_installed_distributions için pip._internal.utils.misc.get_installed_distributionsaçıkça için dış kullanım için olmadığını gösteriyor. Pip 10+ kullanıyorsanız buna güvenmek iyi bir fikir değildir.

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', ...]

1
Evet, tüm paket oluşturucular sürümü ayarlamaz , ancak kullanıyorsanız pipher zaman işe yarayacaktır.
su geçirmez

2
Ne yazık ki, bu çözüm geçerli değildir. Pip, işlem içi API'leri garanti etmez, yalnızca komut satırı üzerinden bir API'yi garanti eder. Bu yaklaşım artık pip 10'da işe yaramıyor
Jason R. Coombs

16

Önceki cevaplar sorunumu çözmedi, ancak bu kod çözdü:

import sys 
for name, module in sorted(sys.modules.items()): 
  if hasattr(module, '__version__'): 
    print name, module.__version__ 

2
Bu, __version__tanımlanmamışsa yazdırmayı denemekten kaçınır . Hayır ise __version__, istediğiniz paket için sonuç almazsınız.
tripleee

Modülün __version__standart olan bir özelliği yoksa ( python.org/dev/peps/pep-0396/#specification ), manuel inceleme olmadan sürümün nereye ve nasıl dahil edildiğini bilmek imkansızdır.
tashuhka

12

Bunun için importlib_metadatakütüphane kullanabilirsiniz .

Python kullanıyorsanız <3.8, önce aşağıdakileri yükleyin:

pip install importlib_metadata

Python'dan beri 3.8standart kütüphaneye dahil edilmiştir.

Ardından, bir paketin sürümünü (bu örnekte lxml) kontrol etmek için şunu çalıştırın:

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

Bunun yalnızca PyPI'den yüklenen paketler için geçerli olduğunu unutmayın. Ayrıca, versionbu paketin sağladığı bir modül adı yerine (genellikle aynı olmalarına rağmen), bir paket adını yönteme bağımsız değişken olarak iletmeniz gerekir .


12

dir()Modülün bir __version__niteliği olup olmadığını öğrenmek için kullanın .

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

Tam Selenyum sürümünü aradım - ve sihirli bir şekilde burada var! Python3 ile çalışır yani - iyi iş!
pbaranski

Bu sağlam bir çözüme en yakın
D Adams

6

Yukarıdaki yöntemler işe yaramazsa, python'da aşağıdakileri denemeye değer:

import modulename

modulename.version
modulename.version_info

Bkz. Python Tornado Sürümü?

Not, .versionbenim için kasırga dışında birkaç kişi üzerinde de çalıştı.


6

önce ortam değişkenlerinize python, pip ekleyin. böylece komutlarınızı komut isteminden çalıştırabilirsiniz. o zaman sadece piton ver komutu . sonra paketi içe aktar

->import scrapy

sonra sürüm adını yazdır

->print(scrapy.__version__)

Bu kesinlikle işe yarayacak


2
Burada birkaç kez tartışıldığı gibi, her modül bir __version__özellik sağlamaz .
reox

pip freeze<package> .__ version_ çalıştı ile birlikte göstermeyen bir paket buldum . Gönderdiğiniz için teşekkürler.
Timothy C. Quinn

6

Jupyter Notebook kullandığımızı varsayarsak (Terminal kullanıyorsanız ünlem işaretlerini bırakın):

1) paket (örn. Xgboost) pip ile yüklenmişse :

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

2) paket (örn. Caffe ) conda ile yüklenmişse :

!conda list caffe

5

Bazı modüllerin __version__özelliği yoktur, bu nedenle en kolay yol terminalde kontrol edilmesidir:pip list


5

Python 3.8 sürümünde metadata, importlibpakette de bunu yapabilen yeni bir modül var .

Dokümanlar'dan bir örnek:

>>> from importlib.metadata import version
>>> version('requests')
'2.22.0'

Bu yöntem, sürüm özelliği tanımlanmadığında çalışma avantajına sahiptir .
Dereckson

3

pythonTerminalde (ilgilendiğiniz python sürümünde) bir kabuk açmanızı, kütüphaneyi içe aktarmanızı ve __version__özniteliğini almanızı öneririm .

>>> import statlib
>>> statlib.__version__

>>> import construct
>>> contruct.__version__

Not 1: Python sürümünü dikkate almalıyız . Farklı python sürümleri yüklediysek, ilgilendiğimiz python sürümünde terminali açmamız gerekir. Örneğin, terminalipython3.8 can (elbette) python3.5veya ile açmaktan farklı bir kitaplık sürümü verir python2.7.

Not 2: Biz kullanmaktan kaçının printişlevini kendi davranış python2 veya python3 bağlı olduğundan,. İhtiyacımız yok, terminal ifadenin değerini gösterecektir.


2

Bu, Windows'taki Jupyter Notebook'da da çalışır! Jupyter, Git Bash (MingW64) gibi bash uyumlu bir komut satırından başlatıldığı sürece, cevapların çoğunda verilen çözümler Windows sistemlerindeki Jupyter Notebook'da küçük bir değişiklikle kullanılabilir.

Anaconda üzerinden Python yüklü Windows 10 Pro çalıştırıyorum ve Jupyter Git Bash üzerinden başlattığımda aşağıdaki kod çalışıyor (ama Anaconda isteminden başlattığımda çalışmıyor).

Tweak: Bunu yapmak için !önüne bir ünlem işareti ( ) ekleyin .pip!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

2

Tüm packges listelemek için Hızlı piton programı (eğer kopyalayabilirsiniz 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)

Çıktı şöyle görünecektir:

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

2

(ayrıca bkz. https://stackoverflow.com/a/56912280/7262247 )

Birçoğu tüm vakaları kapsamadığından , mevcut çeşitli araçları ( Jakub Kukul'un cevabındapkg_resources belirtilen en iyi olanı da dahil olmak üzere) kullanmanın oldukça güvenilir olmadığını gördüm . Örneğin

  • dahili modüller
  • modüller kurulu değil, sadece python yoluna eklenmiş (örneğin IDE'niz tarafından)
  • aynı modülün iki sürümü mevcut (biri kurulu olanın yerine python yolunda)

Herhangi bir paketin, modülün veya alt modülün sürümünü almak için güvenilir bir yola ihtiyacımız olduğundan , getversion yazdım . Kullanımı oldukça basittir:

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

Ayrıntılar için belgelere bakın.


1

Geçerli modülde içe aktarılan standart dışı (pip) modüllerin bir listesini almak için:

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

Sonuç:

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

Not:

Bu kod, hem bu sayfadaki çözümlerden hem de İçe aktarılan modüller nasıl listelenir?


1

Özetle:

conda list   

(Tüm kütüphaneleri sürüm detayları ile birlikte sağlayacaktır).

Ve:

pip show tensorflow

(Komple kütüphane detaylarını verir).



0

Jakub Kukul'un cevabı üzerine inşa bu sorunu çözmenin daha güvenilir bir yolunu buldum.

Bu yaklaşımın temel problemi, paketlerin "geleneksel olarak" kurulmasını (ve bunun kullanımını içermez pip install --user) ya da Python başlangıcında PATH sisteminde olmasını gerektirmesidir.

Bunu yapmak için kullanabilirsiniz pkg_resources.find_distributions(path_to_search). Bu temelde path_to_searchPATH sistemindeyken önemli olabilecek dağıtımları arar .

Bu jeneratör ile şu şekilde tekrarlayabiliriz:

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

Bu, modülleri anahtar olarak ve sürümlerini değer olarak içeren bir sözlük döndürür. Bu yaklaşım sürüm numarasından çok daha fazla genişletilebilir.

Doğru yönü işaret ettiği için Jakub Kukul'a teşekkürler


0

Bu yanıtı Windows kullanıcıları için yazma. Diğer tüm yanıtlarda önerildiği gibi, ifadeleri şu şekilde kullanabilirsiniz:

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

Ancak, yukarıdaki yöntemi kullandıktan sonra bile sürümlerini yazdırmayan bazı modüller vardır. Yani, basitçe yapabileceğiniz şey:

  1. Komut istemini açın.
  2. Python'unuzu ve tüm destekleyici modülleri kurulu durumda tuttuğunuz cd [ dosya adresi ] ' ni kullanarak dosya adresine / dizine gidin .
  3. " pip install [module name] " komutunu kullanın ve enter tuşuna basın.
  4. Bu size " Gereksinim zaten karşılandı: dosya adresi \ klasör adı (sürümle birlikte) " şeklinde .
  5. Ex için aşağıdaki ekran görüntüsüne bakın: "Selenium-Screenshot" adında önceden kurulmuş bir modülün sürümünü bilmek zorundaydım. Bana 1.5.0 olarak doğru gösterdi:

komut istemi ekran görüntüsü


-1

önce böyle bir paket yükleyebilir ve ardından sürümünü kontrol edebilirsiniz

pip install package
import package
print(package.__version__)

paket sürümünü vermeli

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.