Bagaimana cara memeriksa versi modul python?

687

Saya baru saja menginstal modul python: constructdan statlibdengan setuptoolsseperti ini:

# 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

Saya ingin dapat (secara terprogram) memeriksa versinya. Apakah ada yang setara dengan python --versionsaya dapat dijalankan dari baris perintah?

Versi python saya adalah 2.7.3.

tarabyte
sumber
6
kemungkinan duplikat dari Memeriksa versi modul python saat runtime
Ciro Santilli 郝海东 冠状 病 六四 事件 事件 法轮功
12
Bagi yang tertarik dengan solusi baris perintah, gunakan:pip list
KrisWebDev

Jawaban:

730

Saya sarankan menggunakan pip di tempat easy_install . Dengan pip, Anda dapat mendaftar semua paket yang diinstal beserta versinya

pip freeze

Di sebagian besar sistem linux, Anda dapat menyalurkan ini ke grep(atau findstrdi Windows) untuk menemukan baris untuk paket tertentu yang Anda minati:

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

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

Untuk modul individual, Anda dapat mencoba __version__atributnya , namun ada modul tanpa itu:

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

Terakhir, ketika perintah dalam pertanyaan Anda diawali sudo, tampaknya Anda menginstal ke lingkungan python global. Sangat menyarankan untuk memperhatikan manajer lingkungan virtual python , misalnya virtualenvwrapper

alko
sumber
18
jawaban di bawah ini disarankan pip show lxml | grep Version; ini akan berjalan lebih cepat, karena hanya memeriksa satu paket.
Jonathan Vanasco
12
Hanya untuk kelengkapan: Versi ketiga adalahpip list | grep lxml
0xAffe
3
Bagaimana dengan sistem Windows? Apa yang ada grepdi windows? Sejak pip beku | grep lxml tidak berfungsi di windwos.
Raven Cheuk
4
@RavenCheuk usepip list | findstr lxml
Alex F
2
varian windows dengan find (1 karakter lebih pendek ...): daftar pip | cari "lxml"
Jordan Stefanelli
368

Anda dapat mencoba

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

>>> import construct
>>> print contruct.__version__
damienfrancois
sumber
59
Sayangnya, beberapa versi dari beberapa perpustakaan umum (seperti inspect) tidak memiliki __version__atribut.
ely
5
PySerial memiliki serial.VERSION. Mungkin ada beberapa modul lain yang umum digunakan juga, yang tidak mengikuti PEP 0396: python.org/dev/peps/pep-0396
Sussch
6
banyak modul tidak memiliki versi
sdaffa23fdsf
1
@ sdaffa23fdsf modul mana yang tidak memiliki versi? Lebih dari serial, periksa, PyQt dan SQLite? Lihat pycmake .
Pål GD
4
print(contruct.__version__)jika menggunakan Python 3. *
jacanterbury
218

Gunakan pkg_resourcesmodul yang didistribusikan dengan setuptoolsperpustakaan. Perhatikan bahwa string yang Anda lewati ke get_distributionmetode harus sesuai dengan entri PyPI.

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

dan jika Anda ingin menjalankannya dari baris perintah yang dapat Anda lakukan:

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

Perhatikan bahwa string yang Anda berikan ke get_distributionmetode harus nama paket yang terdaftar di PyPI, bukan nama modul yang Anda coba impor.

Sayangnya ini tidak selalu sama (mis. Anda lakukan pip install memcached, tetapi import memcache).

Jakub Kukul
sumber
20
Ini berfungsi bahkan jika modul tidak memiliki atribut __version__.
Imranal
Bagaimana dengan ini? construct.version.full_version
MKatleast3
9
Harus menjadi jawaban teratas, itu satu-satunya cara yang dapat diandalkan untuk mendapatkan versi paket (jika ada)
henryJack
7
Perhatikan bahwa pkg_resources.get_distrinbutiontidak selalu berhasil juga. Ini mengeluarkan beberapa DistributionNotFoundpengecualian dengan pesan kesalahan seperti: "Distribusi 'the_package_name' tidak ditemukan dan diperlukan oleh aplikasi"
mjv
3
@mjv kesalahan Anda kemungkinan besar terjadi karena 1) paket tidak diinstal 2) Anda melewati nama modul, bukan nama paket ke get_distributionmetode
Jakub Kukul
96

Saya pikir ini bisa membantu tetapi instal dulu showpaket untuk menjalankan pip showkemudian gunakan show untuk menemukan versi!

sudo pip install show
# in order to get package version execute the below command
sudo pip show YOUR_PACKAGE_NAME | grep Version
0x3bfc
sumber
2
Tidak ada sukacita di sini! pip: error: No command by the name pip show (maybe you meant "pip install show")
Sam Finnigan
Jawaban ini hanya benar-benar cocok jika Anda memerlukan versi paket dari shell. Jika Anda membutuhkannya dalam Python, ini akan menjadi peretasan yang sangat buruk. Anyways, Anda dapat menggunakan perintah berikut untuk mengekstrak versi: pip show PACKAGE | awk '/^Version: / {sub("^Version: ", ""); print}'. Anda mungkin bisa lolos dengan skrip AWK yang lebih sederhana, tetapi yang disebutkan di atas akan lebih aman untuk setiap kasus tepi.
Enam
3
@SamFinnigan pip showdiimplementasikan pada pip 1.2.1.post1 . Anda menggunakan versi pip yang sangat tanggal sehingga tidak heran Anda mengalami masalah! Saya sedang menjalankan pip 7.1.2 . Jika ada sesuatu yang mencegah Anda memperbarui, Anda selalu dapat menginstalnya secara lokal atau dalam virtualenv.
Enam
telah bekerja untuk saya, terima kasih. beberapa paket tidak memiliki parameter .__ versi__ sehingga yang lebih berguna.
Salih Karagoz
Saya tampaknya mendapatkan perbedaan dalam output: >> print (sklearn .__ versi__) #returns 0.20.3 >> pip show sklearn #return 0.0; bisakah kamu mengklarifikasi?
Sumanth Lazarus
76

Cara yang lebih baik untuk melakukannya adalah:


Untuk rincian Paket spesifik

pip show <package_name>

Ini merinci Package_name, Versi, Penulis, Lokasi dll.


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

Untuk lebih jelasnya: >>> pip help


pip harus diperbarui untuk melakukan ini.

pip install --upgrade pip

Pada Windows merekomendasikan perintah adalah:

python -m pip install --upgrade pip

susan097
sumber
Saya tampaknya mendapatkan perbedaan dalam output: >> print (sklearn .__ versi__) #returns 0.20.3 >> pip show sklearn #return 0.0; bisakah kamu mengklarifikasi?
Sumanth Lazarus
1
Anda harus menggunakan pip show scikit-learnbukan pip show sklearn. sklearn adalah bentuk pendek yang digunakan selama impor, tidak mengenali secara langsung pipkarena scikit-learnpaket lengkapnya tidak belajarsklearn
susan097
42

Di python3 dengan tanda kurung di sekitar cetak

>>> import celery
>>> print(celery.__version__)
3.1.14
pengguna224767
sumber
30
Tidak setiap paket memiliki __version__atribut.
Spedwards
Jawaban ini untuk python 3 - yang merupakan bahasa yang berbeda. Namun, Anda dapat menggunakan jawaban ini di python 2. Untuk melakukannya memerlukan menambahkan baris: "dari masa depan impor print_function", sebelum laporan lainnya.
user1976
1
@ user1976 Ini juga sintaks yang berlaku di Python 2. Tanda kurung hanya ditoleransi di sekitar argumen print, seperti halnya (2)+(3)evaluasi terhadap 5. Ketika Anda memiliki koma di dalam tanda kurung, hal-hal yang mungkin menjadi sedikit lebih menarik, meskipun untuk print, masih berfungsi, semacam.
tripleee
22

module.__version__ adalah hal pertama yang baik untuk dicoba, tetapi itu tidak selalu berhasil.

Jika Anda tidak ingin keluar, dan Anda menggunakan pip 8 atau 9, Anda masih bisa menggunakan pip.get_installed_distributions()untuk mendapatkan versi dari dalam Python:

memperbarui: solusi di sini bekerja di pip 8 dan 9, tetapi dalam pip 10 fungsi telah dipindahkan dari pip.get_installed_distributionske pip._internal.utils.misc.get_installed_distributionsuntuk secara eksplisit menunjukkan bahwa itu tidak untuk penggunaan eksternal. Ini bukan ide yang baik untuk mengandalkan itu jika Anda menggunakan 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', ...]
tahan air
sumber
1
Ya, tidak semua pembuat paket menyetel versi , tetapi jika Anda menggunakan pip, ini harus selalu berfungsi.
anti air
2
Sayangnya, solusi ini tidak dapat digunakan. Pip tidak menjamin API dalam proses, hanya API melalui baris perintah. Pendekatan ini tidak lagi berfungsi pada pip 10.
Jason R. Coombs
16

Jawaban sebelumnya tidak menyelesaikan masalah saya, tetapi kode ini berhasil:

import sys 
for name, module in sorted(sys.modules.items()): 
  if hasattr(module, '__version__'): 
    print name, module.__version__ 
tashuhka
sumber
2
Ini hanya menghindari upaya untuk mencetak __version__jika tidak ditentukan. Jika tidak ada __version__, Anda tidak menerima hasil untuk paket yang Anda inginkan.
tripleee
Jika modul tidak memiliki __version__atribut, yang merupakan standar ( python.org/dev/peps/pep-0396/#specification ), tidak mungkin untuk mengetahui di mana dan bagaimana versi dimasukkan tanpa penyelidikan manual.
tashuhka
12

Anda dapat menggunakan importlib_metadataperpustakaan untuk ini.

Jika Anda menggunakan python <3.8, instal dulu dengan:

pip install importlib_metadata

Karena python 3.8termasuk dalam pustaka standar.

Kemudian, untuk memeriksa versi paket (dalam contoh ini lxml) jalankan:

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

Perlu diingat bahwa ini hanya berfungsi untuk paket yang diinstal dari PyPI. Selain itu, Anda harus memberikan nama paket sebagai argumen ke versionmetode, bukan nama modul yang disediakan paket ini (meskipun biasanya sama).

Jakub Kukul
sumber
12

Gunakan dir()untuk mencari tahu apakah modul memiliki __version__atribut sama sekali.

>>> 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
sumber
Tepat saya mencari versi Selenium - dan ajaibnya di sini kita memilikinya! Bekerja dengan Python3 jadi - kerja bagus!
pbaranski
ini adalah yang paling dekat dengan solusi yang kuat
D Adams
6

Jika metode di atas tidak berhasil, ada baiknya mencoba yang berikut ini dengan python:

import modulename

modulename.version
modulename.version_info

Lihat Dapatkan Versi Python Tornado?

Catatan, itu .versionbekerja untuk saya pada beberapa orang lain selain tornado juga.

D Adams
sumber
6

pertama tambahkan python, pip ke variabel lingkungan Anda. sehingga Anda dapat menjalankan perintah dari command prompt. maka cukup beri perintah python . lalu impor paket

->import scrapy

lalu cetak nama versi

->print(scrapy.__version__)

Ini pasti akan berhasil

suraj garla
sumber
2
seperti yang beberapa kali dibahas di sini, tidak setiap modul menyediakan __version__atribut.
reox
Saya menemukan paket yang tidak ditampilkan dengan pip freeze<package> .__ version_ berfungsi. Terima kasih sudah memposting.
Timothy C. Quinn
6

Dengan asumsi kita menggunakan Jupyter Notebook (jika menggunakan Terminal, lepaskan tanda seru):

1) jika paket (misalnya xgboost) diinstal dengan pip :

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

2) jika paket (mis. Caffe) diinstal dengan conda :

!conda list caffe
pengguna10429366
sumber
5

Beberapa modul tidak memiliki __version__atribut, jadi cara termudah adalah memeriksa di terminal:pip list

Yuchao Jiang
sumber
5

Dalam versi Python 3.8 ada metadatamodul baru dalam importlibpaket, yang bisa melakukan itu juga.

Berikut ini adalah contoh dari dokumen:

>>> from importlib.metadata import version
>>> version('requests')
'2.22.0'
Davit Tovmasyan
sumber
Metode ini memiliki manfaat untuk bekerja ketika atribut versi tidak didefinisikan.
Dereckson
3

Saya sarankan membuka pythonshell di terminal (dalam versi python Anda tertarik), mengimpor perpustakaan, dan mendapatkan __version__atributnya.

>>> import statlib
>>> statlib.__version__

>>> import construct
>>> contruct.__version__

Catatan 1: Kita harus menganggap versi python . Jika kita telah menginstal versi python yang berbeda, kita harus membuka terminal dalam versi python yang kita minati. Misalnya, membuka terminal dengan python3.8dapat (pasti akan) memberikan versi perpustakaan yang berbeda dari membuka dengan python3.5atau python2.7.

Catatan 2: Kami menghindari penggunaan printfungsi , karena perilakunya tergantung pada python2 atau python3. Kami tidak membutuhkannya, terminal akan menunjukkan nilai ekspresi.

dicintai.Yesus
sumber
2

Ini juga berfungsi di Jupyter Notebook di Windows! Selama Jupyter diluncurkan dari baris perintah bash-compliant seperti Git Bash (MingW64), solusi yang diberikan dalam banyak jawaban dapat digunakan dalam Jupyter Notebook pada sistem Windows dengan satu tweak kecil.

Saya menjalankan windows 10 Pro dengan Python diinstal melalui Anaconda, dan kode berikut berfungsi ketika saya meluncurkan Jupyter via Git Bash (tetapi tidak ketika saya memulai dari prompt Anaconda).

Tweak: Tambahkan tanda seru ( !) di depan pipuntuk membuatnya !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
sumber
2

Program python cepat untuk mendaftar semua paket (Anda dapat menyalinnya ke requirement.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)

Outputnya akan terlihat seperti:

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

(lihat juga https://stackoverflow.com/a/56912280/7262247 )

Saya merasa sangat tidak dapat diandalkan untuk menggunakan berbagai alat yang tersedia (termasuk yang terbaik yang pkg_resourcesdisebutkan oleh jawaban Jakub Kukul ), karena kebanyakan dari mereka tidak mencakup semua kasus . Sebagai contoh

  • modul bawaan
  • modul tidak diinstal tetapi hanya ditambahkan ke jalur python (oleh IDE Anda misalnya)
  • dua versi dari modul yang sama tersedia (satu di jalur python menggantikan yang terpasang)

Karena kita membutuhkan cara yang dapat diandalkan untuk mendapatkan versi setiap paket, modul atau submodule, saya akhirnya menulis getversion . Sangat mudah digunakan:

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

Lihat dokumentasi untuk detailnya.

nyonya
sumber
1

Untuk mendapatkan daftar modul non-standar (pip) yang diimpor dalam modul saat ini:

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

Hasil:

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

catatan:

Kode ini disatukan dari solusi baik di halaman ini dan dari Cara daftar modul yang diimpor?

Tobias Bleisch
sumber
1

Singkatnya:

conda list   

(Ini akan memberikan semua perpustakaan bersama dengan detail versi).

Dan:

pip show tensorflow

(Ini memberikan detail perpustakaan lengkap).

Tej
sumber
1

Anda dapat mencoba ini:

pip list

Ini akan menampilkan semua paket dengan versinya. Keluaran

CRBelhekar
sumber
0

Membangun jawaban Jakub Kukul saya menemukan cara yang lebih dapat diandalkan untuk menyelesaikan masalah ini.

Masalah utama dari pendekatan itu adalah yang mengharuskan paket untuk diinstal "secara konvensional" (dan itu tidak termasuk menggunakan pip install --user), atau berada di sistem PATH di inisialisasi Python.

Untuk menyiasati itu bisa Anda gunakan pkg_resources.find_distributions(path_to_search). Ini pada dasarnya mencari distribusi yang dapat diimpor jika path_to_searchberada di sistem PATH.

Kita dapat beralih melalui generator ini seperti ini:

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

Ini akan mengembalikan kamus yang memiliki modul sebagai kunci dan versinya sebagai nilai. Pendekatan ini dapat diperluas lebih dari sekadar nomor versi.

Terima kasih kepada Jakub Kukul karena menunjuk ke arah yang benar

Arena Alessio
sumber
0

Menulis jawaban ini untuk pengguna windows. Seperti yang disarankan dalam semua jawaban lain, Anda dapat menggunakan pernyataan sebagai:

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

Tetapi, ada beberapa modul yang tidak mencetak versinya bahkan setelah menggunakan metode di atas. Jadi, yang bisa Anda lakukan adalah:

  1. Buka prompt perintah.
  2. Arahkan ke alamat file / direktori dengan menggunakan cd [ alamat file ] tempat Anda menyimpan python dan semua modul pendukung terpasang.
  3. gunakan perintah " pip install [module name] " dan tekan enter.
  4. Ini akan menampilkan pesan kepada Anda " Persyaratan sudah dipenuhi: alamat file \ nama folder (dengan versi) ".
  5. Lihat screenshot di bawah ini untuk contoh: Saya harus tahu versi dari modul yang sudah diinstal sebelumnya bernama "Selenium-Screenshot". Itu menunjukkan saya dengan benar sebagai 1.5.0:

tangkapan layar command prompt

lousycoder
sumber
-1

Anda dapat menginstal beberapa paket seperti ini terlebih dahulu dan kemudian memeriksa versinya

pip install package
import package
print(package.__version__)

itu akan memberi Anda versi paket

Shaina Raza
sumber