Tìm phiên bản nào của gói được cài đặt với pip


709

Sử dụng pip, có thể tìm ra phiên bản nào của gói hiện đang được cài đặt không?

Tôi biết về pip install XYZ --upgradenhưng tôi tự hỏi nếu có bất cứ điều gì như thế pip info XYZ. Nếu không, đó sẽ là cách tốt nhất để nói tôi đang sử dụng phiên bản nào.


4
có một đề xuất cho một showlệnh trong pip: github.com/pypa/pip/issues/33
Hugo Tavares

Câu trả lời:


1013

Theo pip 1.3 , có một pip showlệnh.

$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe

Trong các phiên bản cũ hơn, pip freezegrepnên làm công việc độc đáo.

$ pip freeze | grep Jinja2
Jinja2==2.7.3

8
@techtonik: Đó là để đóng băng các mô-đun hiện tại vào một tệp.txt .
Hugo

@Hugo: Tôi sẽ sử dụng savetên.
anatoly techtonik

5
Việc đặt tên 'đóng băng' là lịch sử - nó bắt nguồn từ ít nhất là năm 2008 . Vào thời điểm đó, nhiều người đã quen thuộc với đá quý ruby ​​"đóng băng", vì vậy pip đã mượn cái tên được sử dụng rộng rãi sau đó.
AdamKG

2
điều này không rõ ràng cũng không được ghi lại, nhưng bạn có thể nhập pip show pipđể lấy thông tin phiên bản của pip, thay vì pip --versionnhư tôi mong đợi.
Marc Maxmeister

pip freezecó lợi thế là nó hiển thị các phiên bản kiểm tra VCS có thể chỉnh sửa một cách chính xác, trong khi pip showthì không.
spookylukey

63

Tôi vừa gửi một yêu cầu kéo trong pip với sự tăng cường Hugo Tavares nói:

(ví dụ cụ thể)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

2
Hình như nó đã được hợp nhất rồi.
anatoly techtonik

43

Pip 1.3 bây giờ cũng có một lệnh danh sách :

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)

Nói tên gói là X. Để tìm phiên bản - Sự khác biệt giữa việc sử dụng danh sách pip và nhập X và sau đó là X .__ phiên bản__ là gì? Cả hai phiên bản gói?
biến

cả hai đều hợp lệ, nhưng pip listlà chung chung, và __version__không. Tôi cũng đã thấy version()get_version()cho một nhập khẩu.
RickyA

35

và với --outdated như một đối số bổ sung, bạn sẽ nhận được các phiên bản Hiện tại và Mới nhất của các gói bạn đang sử dụng:

$ pip list --outdated
distribute (Current: 0.6.34 Latest: 0.7.3)
django-bootstrap3 (Current: 1.1.0 Latest: 4.3.0)
Django (Current: 1.5.4 Latest: 1.6.4)
Jinja2 (Current: 2.6 Latest: 2.8)

Vì vậy, kết hợp với câu trả lời của AdamKG:

$ pip list --outdated | grep Jinja2
Jinja2 (Current: 2.6 Latest: 2.8)

Kiểm tra pip-tools quá: https://github.com/nvie/pip-tools


1
Một lựa chọn thú vị. Tôi muốn có nó liệt kê tất cả trong số họ, và cho tôi biết nếu bất kỳ trong số họ đã lỗi thời, mặc dù.
ArtOfWarfare

17

Bạn cũng có thể cài đặt yolkvà sau đó chạy yolk -lcũng cung cấp một số đầu ra tốt đẹp. Đây là những gì tôi nhận được cho virtualenv nhỏ của mình:

(venv)CWD> /space/vhosts/pyramid.xcode.com/venv/build/unittest 
project@pyramid 43> yolk -l
Chameleon       - 2.8.2        - active 
Jinja2          - 2.6          - active 
Mako            - 0.7.0        - active 
MarkupSafe      - 0.15         - active 
PasteDeploy     - 1.5.0        - active 
Pygments        - 1.5          - active 
Python          - 2.7.3        - active development (/usr/lib/python2.7/lib-dynload)
SQLAlchemy      - 0.7.6        - active 
WebOb           - 1.2b3        - active 
account         - 0.0          - active development (/space/vhosts/pyramid.xcode.com/project/account)
distribute      - 0.6.19       - active 
egenix-mx-base  - 3.2.3        - active 
ipython         - 0.12         - active 
logilab-astng   - 0.23.1       - active 
logilab-common  - 0.57.1       - active 
nose            - 1.1.2        - active 
pbkdf2          - 1.3          - active 
pip             - 1.0.2        - active 
pyScss          - 1.1.3        - active 
pycrypto        - 2.5          - active 
pylint          - 0.25.1       - active 
pyramid-debugtoolbar - 1.0.1        - active 
pyramid-tm      - 0.4          - active 
pyramid         - 1.3          - active 
repoze.lru      - 0.5          - active 
simplejson      - 2.5.0        - active 
transaction     - 1.2.0        - active 
translationstring - 1.1          - active 
venusian        - 1.0a3        - active 
waitress        - 0.8.1        - active 
wsgiref         - 0.1.2        - active development (/usr/lib/python2.7)
yolk            - 0.4.3        - active 
zope.deprecation - 3.5.1        - active 
zope.interface  - 3.8.0        - active 
zope.sqlalchemy - 0.7          - active 

9

Bạn có thể sử dụng lệnh grep để tìm hiểu.

pip show <package_name>|grep Version

Thí dụ:

pip show urllib3|grep Version

sẽ chỉ hiển thị các phiên bản.

Phiên bản siêu dữ liệu:
Phiên bản 2.0 : 1.12


8

Cách dễ nhất là đây:

import jinja2
print jinja2.__version__

7
Điều này chỉ hoạt động cho các gói đã được xác định __version__trong mã nguồn của họ. Nhiều gói không.
spookylukey

Có phải là thông lệ tốt để bao gồm phiên bản này trong khi đóng gói hoặc thực tế là chỉ có phiên bản trong tham số phiên bản tệp tin cài đặt?
biến

Phương pháp này cũng không mạnh để gói không nhất quán đặt tên (có ít nhất 3 loại) giữa đầu vào dự kiến importvà đầu ra của pip freeze.
mirekphd

6

Ngoài ra còn có một công cụ được gọi là pip-checkcung cấp cho bạn tổng quan nhanh về tất cả các gói đã cài đặt và trạng thái cập nhật của chúng:

nhập mô tả hình ảnh ở đây

Không sử dụng nó cho mình; chỉ vấp phải nó và câu hỏi SO này liên tiếp, và vì nó không được đề cập ...


Làm thế nào để chạy cái này trên windows
vela

1
@vela Tôi hy vọng nó sẽ hoạt động giống hệt trên Windows. Tất nhiên bạn sẽ phải cài đặt nó trước, như bạn đã làm trên bất kỳ hệ thống nào.
Ola Tuvesson

5

Trên cửa sổ, bạn có thể ra lệnh như:

pip show setuptools | findstr "Version"

Đầu ra:

Version: 34.1.1

2

Hàm python chỉ trả về phiên bản gói ở định dạng máy có thể đọc được:

from importlib.metadata import version 
version('numpy')

Trước trăn 3,8:

pip install importlib-metadata 
from importlib_metadata import version
version('numpy')

Tương đương bash (ở đây cũng được gọi từ python) sẽ phức tạp hơn nhiều (nhưng mạnh mẽ hơn - xem cảnh báo bên dưới):

import subprocess
def get_installed_ver(pkg_name):
    bash_str="pip freeze | grep -w %s= | awk -F '==' {'print $2'} | tr -d '\n'" %(pkg_name)
    return(subprocess.check_output(bash_str, shell=True).decode())

Sử dụng mẫu:

# pkg_name="xgboost"
# pkg_name="Flask"
# pkg_name="Flask-Caching"
pkg_name="scikit-learn"

print(get_installed_ver(pkg_name))
>>> 0.22

Lưu ý rằng trong cả hai trường hợp, pkg_nametham số nên chứa tên gói theo định dạng được trả về pip freezevà không được sử dụng trong thời gian import, ví dụ: scikit-learnkhông sklearnhoặc Flask-Cachingkhôngflask_caching .

Lưu ý rằng trong khi gọi pip freezephiên bản bash có vẻ không hiệu quả, chỉ có phương pháp này chứng tỏ đủ mạnh mẽ để đóng gói các đặc điểm và sự không nhất quán (ví dụ: gạch dưới so với dấu gạch ngang, chữ nhỏ so với chữ hoa lớn và chữ viết tắt như sklearnvsscikit-learn ).

Thận trọng: trong các môi trường phức tạp, cả hai biến thể đều có thể trả về số phiên bản bất ngờ, không phù hợp với những gì bạn thực sự có thể nhận được trong thời gian import.

Một vấn đề như vậy phát sinh khi có các phiên bản khác của gói được ẩn trong thư mục con người dùng site-packages . Như một minh họa về sự nguy hiểm của việc sử dụng version()đây là một tình huống tôi gặp phải:

$ pip freeze | grep lightgbm
lightgbm==2.3.1

and

$ python -c "import lightgbm; print(lightgbm.__version__)"
2.3.1

vs.

$ python -c "from importlib_metadata import version; print(version(\"lightgbm\"))"
2.2.3

until you delete the subfolder with the old version (here 2.2.3) from the user folder (only one would normally be preserved by `pip` - the one installed as last with the `--user` switch):

$ ls /home/jovyan/.local/lib/python3.7/site-packages/lightgbm*
/home/jovyan/.local/lib/python3.7/site-packages/lightgbm-2.2.3.dist-info
/home/jovyan/.local/lib/python3.7/site-packages/lightgbm-2.3.1.dist-info

Một vấn đề khác là có một số gói cài đặt conda trong cùng một môi trường. Nếu họ chia sẻ các phụ thuộc với các gói cài đặt pip của bạn và các phiên bản của các phụ thuộc này khác nhau, bạn có thể bị hạ cấp các phụ thuộc được cài đặt pip.

Để minh họa, phiên bản mới nhất numpycó sẵn trong PyPI vào ngày 04-01-2020 là 1.18.0, trong khi đó, conda-forgekênh của Anaconda chỉ có phiên bản 1.17.3 numpymới nhất. Vì vậy, khi bạn cài đặt basemapgói với conda (dưới dạng thứ hai), cài đặt pip trước đó của bạn numpysẽ bị hạ cấp bởi conda xuống 1.17.3 và phiên bản 1.18.0 sẽ không khả dụng với importchức năng. Trong trường hợp này version()sẽ đúng và pip freeze/ conda listsai:

$ python -c "from importlib_metadata import version; print(version(\"numpy\"))"
1.17.3

$ python -c "import numpy; print(numpy.__version__)"
1.17.3

$ pip freeze | grep numpy
numpy==1.18.0

$ conda list | grep numpy
numpy                     1.18.0                   pypi_0    pypi

1
Tại sao không sử dụng importlib.metadata.version('NameOfProject')? docs.python.org/3/library/...
sinoroc

1
Tuyệt vời tìm thấy @sinoroc! Tôi nghĩ bạn nên đăng nó dưới dạng câu trả lời và tôi sẽ xóa câu trả lời quá from importlib_metadata import version; version('Flask-Caching')
lố

1
Tôi sẽ để bạn đi cho nó
sinoroc

Chỉnh sửa mới nhất của bạn làm tôi ngạc nhiên. Bạn có thể thử python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"không?
sinoroc

Câu trả lời đó cung cấp cho bạn câu trả lời đúng - phiên bản mới nhất được cài đặt (2.3.1), khi version()vẫn trả về phiên bản sớm nhất (cũ nhất) (2.2.3). Bạn có thể sao chép kết quả này bằng cách cài đặt cả hai phiên bản với công --usertắc, nhưng bảo quản lightgbm-2.2.3.dist-infothư mục theo cách thủ công , để có cả hai phiên bản đó với nhau, như được liệt kê ở trên (pip thường sẽ loại bỏ nó - cho đến khi không).
mirekphd

1

Pip show hoạt động trong python 3.7:

pip show selenium
Name: selenium
Version: 4.0.0a3
Summary: Python bindings for Selenium
Home-page: https://github.com/SeleniumHQ/selenium/
Author: UNKNOWN
Author-email: UNKNOWN
License: Apache 2.0
Location: c:\python3.7\lib\site-packages\selenium-4.0.0a3-py3.7.egg
Requires: urllib3
Required-by:

Nó không phải là câu trả lời chuẩn.
ham baziyad

1

Để thực hiện việc này bằng mã Python:

Sử dụng importlib.metadata.version

Con ≥3.8

import importlib.metadata
importlib.metadata.version('beautifulsoup4')
'4.9.1'

Con ≤3,7

(sử dụng importlib_metadata.version)

!pip install importlib-metadata

import importlib_metadata
importlib_metadata.version('beautifulsoup4')
'4.9.1'

Sử dụng pkg_resources.Distribution

import pkg_resources
pkg_resources.get_distribution('beautifulsoup4').version
'4.9.1'
pkg_resources.get_distribution('beautifulsoup4').parsed_version
<Version('4.9.1')>

Được ghi nhận vào ý kiến ​​của sinorocmirekphd .


0

Đối với Windows, bạn có thể

  1. mở cmd và gõ python, nhấn enter.

  2. gõ nhập và nhấn enter.

  3. gõ ._version__ và nhấn enter.

Như bạn có thể thấy trong ảnh chụp màn hình ở đây, tôi đang sử dụng phương pháp này để kiểm tra phiên bản của mô-đun nối tiếp.

Hình ảnh



0

Trong câu hỏi, nó không được đề cập đến người dùng hệ điều hành nào đang sử dụng (Windows / Linux / Mac)

Vì có một vài câu trả lời sẽ hoạt động hoàn hảo trên Mac và Linux.

Lệnh dưới đây có thể được sử dụng trong trường hợp người dùng đang cố gắng tìm phiên bản của gói python trên windows.

Trong PowerShell, sử dụng lệnh bên dưới:

pip list | findstr <PackageName>

Thí dụ:- pip list | findstr requests

Đầu ra: requests 2.18.4

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.