Làm thế nào để kiểm tra phiên bản của mô-đun python?


685

Tôi chỉ cần cài đặt các module python: constructstatlibvới setuptoolsnhư thế này:

# 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

Tôi muốn có thể (lập trình) kiểm tra các phiên bản của họ. Có tương đương với python --versiontôi có thể chạy từ dòng lệnh?

Phiên bản trăn của tôi là 2.7.3.




12
Đối với những người quan tâm bằng giải pháp dòng lệnh, hãy sử dụng:pip list
KrisWebDev

Câu trả lời:


726

Tôi đề nghị sử dụng pip thay cho easy_install . Với pip, bạn có thể liệt kê tất cả các gói đã cài đặt và các phiên bản của chúng với

pip freeze

Trong hầu hết các hệ thống linux, bạn có thể chuyển nó sang grep(hoặc findstrtrên Windows) để tìm hàng cho gói cụ thể mà bạn quan tâm:

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

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

Đối với một mô-đun riêng lẻ, bạn có thể thử __version__thuộc tính , tuy nhiên có các mô-đun không có nó:

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

Cuối cùng, vì các lệnh trong câu hỏi của bạn có tiền tố sudo, có vẻ như bạn đang cài đặt vào môi trường python toàn cầu. Rất khuyến khích xem xét các nhà quản lý môi trường ảo python , ví dụ như virtualenvwrapper


18
một câu trả lời dưới đây được đề xuất pip show lxml | grep Version; Điều này sẽ chạy nhanh hơn nhiều, vì nó chỉ kiểm tra một gói duy nhất.
Jonathan Vanasco

12
Chỉ để hoàn thiện: Phiên bản thứ ba làpip list | grep lxml
0xAffe

3
Làm thế nào về hệ thống Windows? Các grepcửa sổ là gì? Kể từ khi pip đóng băng | grep lxml không hoạt động trên Windwos.
Raven Cheuk

4
@RavenCheuk sử dụngpip list | findstr lxml
Alex F

2
cửa sổ biến thể với find (ngắn hơn 1 ký tự ...): danh sách pip | tìm "lxml"
Jordan Stefanelli

366

Bạn co thể thử

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

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

59
Thật không may, inspectmột số phiên bản của một số thư viện phổ biến (chẳng hạn như ) không có __version__thuộc tính.
ely

5
PySerial có serial.VERSION. Có thể có một số mô-đun thường được sử dụng khác, không tuân theo PEP 0394: python.org/dev/peps/pep-0394
Sussch

6
rất nhiều mô-đun không có phiên bản
sdaffa23fdsf

1
@ sdaffa23fdsf mô-đun nào không có phiên bản? Nhiều hơn nối tiếp, kiểm tra, PyQt và SQLite? Xem pycmake .
Pål GD

4
print(contruct.__version__)nếu sử dụng Python 3. *
jacanterbury

216

Sử dụng pkg_resourcesmô-đun phân phối với setuptoolsthư viện. Lưu ý rằng chuỗi mà bạn truyền cho get_distributionphương thức sẽ tương ứng với mục nhập PyPI.

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

và nếu bạn muốn chạy nó từ dòng lệnh, bạn có thể làm:

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

Lưu ý rằng chuỗi mà bạn truyền cho get_distributionphương thức phải là tên gói như đã đăng ký trong PyPI, không phải tên mô-đun mà bạn đang cố gắng nhập.

Thật không may, những điều này không phải lúc nào cũng giống nhau (ví dụ như bạn làm pip install memcached, nhưng import memcache).


19
Điều này hoạt động ngay cả khi mô-đun không có thuộc tính __version__.
imranal

Cái này thì sao? construct.version.full_version
MKatleast3

8
Nên là câu trả lời hàng đầu, đó là cách đáng tin cậy duy nhất để có phiên bản gói (nếu có)
henryJack

7
Lưu ý rằng pkg_resources.get_distrinbutionkhông phải lúc nào cũng hoạt động. Nó phát hành một số DistributionNotFoundngoại lệ với thông báo lỗi như: "Phân phối 'the_package_name' không được tìm thấy và được ứng dụng yêu cầu"
mjv

2
@mjv lỗi của bạn rất có thể xảy ra vì 1) gói chưa được cài đặt 2) bạn đang chuyển tên mô-đun thay vì tên gói cho get_distributionphương thức
Jakub Kukul

96

Tôi nghĩ rằng điều này có thể giúp nhưng cài đặt showgói đầu tiên để chạy pip showsau đó sử dụng chương trình để tìm phiên bản!

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

2
Không có niềm vui ở đây! pip: error: No command by the name pip show (maybe you meant "pip install show")
Sam Finnigan

Câu trả lời này chỉ thực sự phù hợp nếu bạn cần một phiên bản gói từ vỏ. Nếu bạn cần nó trong Python, đây sẽ là một bản hack khá tệ. Dù sao, bạn có thể sử dụng lệnh sau để trích xuất phiên bản : pip show PACKAGE | awk '/^Version: / {sub("^Version: ", ""); print}'. Bạn có thể có thể thoát khỏi một tập lệnh AWK đơn giản hơn, nhưng đã nói ở trên sẽ an toàn hơn cho mọi trường hợp cạnh.
Sáu

3
@SamFinnigan pip showđã được triển khai trong pip 1.2.1.post1 . Bạn đang sử dụng một phiên bản cực kỳ lỗi thời của pip nên không có gì lạ khi bạn gặp sự cố! Tôi hiện đang chạy pip 7.1.2 . Nếu có thứ gì đó ngăn bạn cập nhật, bạn luôn có thể cài đặt cục bộ hoặc trong virtualenv.
Sáu

đã làm việc cho tôi cảm ơn. một số thông số không có tham số .__ phiên bản__ để một thông số hữu ích hơn.
Salih Karagoz

Tôi dường như nhận được sự khác biệt về đầu ra: >> print (sklearn .__ phiên bản__) #returns 0.20.3 >> pip show sklearn #return 0.0; bạn có thể làm rõ?
Sumanth Lazarus

76

Cách tốt hơn để làm điều đó là:


Để biết chi tiết về Gói cụ thể

pip show <package_name>

Nó chi tiết ra Gói_name, Phiên bản, Tác giả, Vị trí, v.v.


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

Để biết thêm chi tiết: >>> pip help


pip nên được cập nhật để làm điều này.

pip install --upgrade pip

Trên Windows khuyến nghị lệnh là:

python -m pip install --upgrade pip


Tôi dường như nhận được sự khác biệt về đầu ra: >> print (sklearn .__ phiên bản _) #returns 0.20.3 >> pip show sklearn #return 0.0; bạn có thể làm rõ?
Sumanth Lazarus

1
Bạn nên sử dụng pip show scikit-learnthay vì pip show sklearn. sklearn là hình thức ngắn được sử dụng trong quá trình nhập, không nhận ra trực tiếp pipvì đây scikit-learnlà gói đầy đủ không họcsklearn
susan097

42

Trong python3 với dấu ngoặc quanh bản in

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

30
Không phải mọi gói đều có một __version__thuộc tính.
Spedwards

Câu trả lời này dành cho python 3 - một ngôn ngữ khác. Tuy nhiên, bạn có thể sử dụng câu trả lời này trong python 2. Để làm như vậy đòi hỏi phải thêm dòng: "từ nhập print_feft trong tương lai ", trước các câu lệnh khác.
dùng1976

1
@ user1976 Đây cũng là cú pháp hợp lệ trong Python 2. Các dấu ngoặc đơn giản được dung thứ xung quanh đối số print, giống như các (2)+(3)đánh giá 5. Khi bạn có dấu phẩy bên trong dấu ngoặc đơn, mọi thứ có thể trở nên thú vị hơn một chút, mặc dù vậy print, nó vẫn hoạt động, sắp xếp.
tripleee

22

module.__version__ là một điều tốt đầu tiên để thử, nhưng nó không luôn luôn hoạt động.

Nếu bạn không muốn trình bày và bạn đang sử dụng pip 8 hoặc 9, bạn vẫn có thể sử dụng pip.get_installed_distributions()để nhận các phiên bản từ trong Python:

cập nhật: giải pháp ở đây hoạt động trong pip 8 và 9, nhưng trong pip 10, chức năng đã được chuyển từ pip.get_installed_distributionssang pip._internal.utils.misc.get_installed_distributionsđể chỉ rõ rằng nó không được sử dụng bên ngoài. Không nên dựa vào nó nếu bạn đang sử dụng 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', ...]

1
Có, không phải tất cả người tạo gói đều đặt phiên bản , nhưng nếu bạn đang sử dụng pip, thì điều này sẽ luôn hoạt động.
không thấm nước

2
Thật không may, giải pháp này không khả thi. Pip không đảm bảo bất kỳ API trong quá trình nào, chỉ một API thông qua dòng lệnh. Cách tiếp cận này không còn hoạt động trên pip 10.
Jason R. Coombs

16

Các câu trả lời trước không giải quyết được vấn đề của tôi, nhưng mã này đã làm:

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

2
Điều này chỉ tránh cố gắng in __version__nếu nó không được xác định. Nếu không có __version__, bạn không nhận được kết quả nào cho gói bạn muốn.
tripleee

Nếu mô-đun không có __version__thuộc tính, đó là tiêu chuẩn ( python.org/dev/peps/pep-0394/#specifying ), không thể biết phiên bản được bao gồm ở đâu và như thế nào mà không cần điều tra thủ công.
tashuhka

12

Bạn có thể dùng importlib_metadata thư viện cho việc này.

Nếu bạn đang dùng python <3.8, trước tiên hãy cài đặt nó bằng:

pip install importlib_metadata

Kể từ khi trăn 3.8 nó được bao gồm trong thư viện tiêu chuẩn.

Sau đó, để kiểm tra phiên bản của gói (trong ví dụ này lxml) chạy:

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

Hãy nhớ rằng điều này chỉ hoạt động cho các gói được cài đặt từ PyPI. Ngoài ra, bạn phải truyền tên gói làm đối số cho versionphương thức, thay vì tên mô-đun mà gói này cung cấp (mặc dù chúng thường giống nhau).


12

Sử dụng dir()để tìm hiểu xem mô-đun có __version__thuộc tính nào không.

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

Chính xác là tôi đã tìm phiên bản Selenium - và thật kỳ diệu ở đây chúng tôi có nó! Làm việc với Python3 vì vậy - công việc tốt!
pbaranski

đây là giải pháp mạnh nhất
D Adams

6

Nếu các phương pháp trên không hoạt động, đáng để thử các cách sau trong python:

import modulename

modulename.version
modulename.version_info

Xem Nhận phiên bản Python Tornado?

Lưu ý, công .versionviệc cho tôi trên một vài người khác ngoài cơn lốc xoáy là tốt.


6

đầu tiên thêm python, pip vào các biến môi trường của bạn. để bạn có thể thực hiện các lệnh của mình từ dấu nhắc lệnh. sau đó chỉ cần đưa ra lệnh python . sau đó nhập gói

->import scrapy

sau đó in tên phiên bản

->print(scrapy.__version__)

Điều này chắc chắn sẽ làm việc


2
như nhiều lần thảo luận ở đây, không phải mô-đun nào cũng cung cấp một __version__thuộc tính.
reox

Tôi đã tìm thấy một gói không hiển thị với pip freezetuy nhiên <gói> .__ version_ đã hoạt động. Cảm ơn vì đăng.
Timothy C. Quinn

6

Giả sử chúng tôi đang sử dụng Jupyter Notebook (nếu sử dụng Terminal, hãy bỏ dấu chấm than):

1) nếu gói (ví dụ xgboost) được cài đặt với pip :

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

2) nếu gói (ví dụ : caffe ) được cài đặt với conda :

!conda list caffe

5

Một số mô-đun không có __version__thuộc tính, vì vậy cách dễ nhất là kiểm tra trong thiết bị đầu cuối:pip list


5

Trong phiên bản Python 3.8 có một metadatamô-đun mới trong importlibgói, cũng có thể làm điều đó.

Đây là một ví dụ từ các tài liệu:

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

Phương pháp này có lợi ích khi hoạt động khi thuộc tính phiên bản không được xác định.
Dereckson

3

Tôi khuyên bạn nên mở pythonshell trong terminal (trong phiên bản python mà bạn quan tâm), nhập thư viện và lấy __version__thuộc tính của nó .

>>> import statlib
>>> statlib.__version__

>>> import construct
>>> contruct.__version__

Lưu ý 1: Chúng ta phải coi phiên bản python . Nếu chúng tôi đã cài đặt các phiên bản khác nhau của python, chúng tôi phải mở thiết bị đầu cuối trong phiên bản python mà chúng tôi quan tâm. Ví dụ: mở thiết bị đầu cuối bằng python3.8can (chắc chắn sẽ) cung cấp một phiên bản khác của thư viện so với mở bằng python3.5hoặc python2.7.

Lưu ý 2: Chúng tôi tránh sử dụng printhàm , vì hành vi của nó phụ thuộc vào python2 hoặc python3. Chúng tôi không cần nó, thiết bị đầu cuối sẽ hiển thị giá trị của biểu thức.


2

Điều này cũng hoạt động trong Jupyter Notebook trên Windows! Miễn là Jupyter được khởi chạy từ một dòng lệnh tuân thủ bash như Git Bash (MingW64), các giải pháp được đưa ra trong nhiều câu trả lời có thể được sử dụng trong Notebook Jupyter trên các hệ thống Windows với một điều chỉnh nhỏ.

Tôi đang chạy windows 10 Pro với Python được cài đặt qua Anaconda và đoạn mã sau hoạt động khi tôi khởi chạy Jupyter qua Git Bash (nhưng không phải khi tôi khởi chạy từ dấu nhắc Anaconda).

Các tinh chỉnh: Thêm một dấu chấm than ( !) ở phía trước pipđể làm cho nó !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

Chương trình python nhanh để liệt kê tất cả packges (bạn có thể sao chép nó vào 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)

Đầu ra sẽ như sau:

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

2

(xem thêm https://stackoverflow.com/a/56912280/7262247 )

Tôi thấy khá khó tin khi sử dụng các công cụ khác nhau có sẵn (bao gồm cả công cụ tốt nhất pkg_resourcesđược đề cập bởi câu trả lời của Jakub Kukul ), vì hầu hết chúng không bao gồm tất cả các trường hợp . Ví dụ

  • mô-đun tích hợp
  • các mô-đun không được cài đặt mà chỉ được thêm vào đường dẫn python (ví dụ như IDE của bạn)
  • có sẵn hai phiên bản của cùng một mô-đun (một trong đường dẫn python thay thế cho một cài đặt)

Kể từ khi chúng tôi cần một cách đáng tin cậy để có được phiên bản của bất kỳ gói, mô-đun hoặc submodule, tôi đã kết thúc bằng văn bản getversion . Nó khá đơn giản để sử dụng:

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

Xem tài liệu để biết chi tiết.


1

Để có danh sách các mô-đun (pip) không chuẩn được nhập trong mô-đun hiện tại:

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

Kết quả:

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

Ghi chú:

Mã này được kết hợp từ các giải pháp cả trên trang này và từ Làm thế nào để liệt kê các mô-đun đã nhập?


1

Tóm tắt:

conda list   

(Nó sẽ cung cấp tất cả các thư viện cùng với chi tiết phiên bản).

Và:

pip show tensorflow

(Nó cung cấp chi tiết thư viện đầy đủ).


0

Dựa trên câu trả lời của Jakub Kukul, tôi đã tìm ra một cách đáng tin cậy hơn để giải quyết vấn đề này.

Vấn đề chính của cách tiếp cận đó là yêu cầu các gói phải được cài đặt "theo quy ước" (và điều đó không bao gồm việc sử dụng pip install --user ) hoặc nằm trong hệ thống PATH khi khởi tạo Python.

Để có được xung quanh mà bạn có thể sử dụng pkg_resources.find_distributions(path_to_search). Điều này về cơ bản tìm kiếm các bản phân phối có thể nhập được nếu path_to_searchcó trong hệ thống PATH.

Chúng ta có thể lặp qua trình tạo này như thế này:

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

Điều này sẽ trả về một từ điển có các mô-đun là khóa và phiên bản của chúng là giá trị. Cách tiếp cận này có thể được mở rộng hơn rất nhiều so với số phiên bản.

Cảm ơn Jakub Kukul vì đã chỉ đúng hướng


0

Viết câu trả lời này cho người dùng windows. Như được đề xuất trong tất cả các câu trả lời khác, bạn có thể sử dụng các câu như:

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

Nhưng, có một số mô-đun không in phiên bản của chúng ngay cả sau khi sử dụng phương pháp trên. Vì vậy, những gì bạn có thể làm đơn giản là:

  1. Mở dấu nhắc lệnh.
  2. Điều hướng đến địa chỉ tệp / thư mục bằng cách sử dụng cd [ địa chỉ tệp ] nơi bạn đã giữ python và tất cả các mô-đun hỗ trợ được cài đặt.
  3. sử dụng lệnh " pip install [tên mô-đun] " và nhấn enter.
  4. Điều này sẽ hiển thị cho bạn một thông báo là " Yêu cầu đã được thỏa mãn: địa chỉ tệp \ tên thư mục (có phiên bản) ".
  5. Xem ảnh chụp màn hình bên dưới để biết ví dụ: Tôi phải biết phiên bản của một mô-đun được cài đặt sẵn có tên là "Selenium-Ảnh chụp màn hình". Nó cho tôi thấy chính xác là 1.5.0:

ảnh chụp màn hình nhắc lệnh


0

Bạn có thể thử điều này:

pip list

Điều này sẽ xuất tất cả các gói với phiên bản của họ. Đầu ra


-1

trước tiên bạn có thể cài đặt một số gói như thế này và sau đó kiểm tra phiên bản của nó

pip install package
import package
print(package.__version__)

nó sẽ cung cấp cho bạn phiên bản gói

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.