ค้นหาแพ็คเกจเวอร์ชันที่ติดตั้งด้วย pip


711

การใช้ pip มันเป็นไปได้ไหมที่จะคิดว่าเวอร์ชั่นของแพ็คเกจใดที่ติดตั้งอยู่ในปัจจุบัน?

ฉันรู้เกี่ยวกับpip install XYZ --upgradeแต่ฉันสงสัยว่ามีอะไรที่เหมือนpip info XYZกัน หากไม่ใช่สิ่งที่จะเป็นวิธีที่ดีที่สุดในการบอกเวอร์ชันที่ฉันใช้อยู่ในปัจจุบัน


4
มีข้อเสนอสำหรับshowคำสั่งใน pip: github.com/pypa/pip/issues/33
Hugo Tavares

คำตอบ:


1015

ตั้งแต่pip 1.3มีpip showคำสั่ง

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

ในรุ่นเก่าpip freezeและgrepควรทำผลงานได้ดี

$ pip freeze | grep Jinja2
Jinja2==2.7.3

8
@ techtonik: มันมีไว้สำหรับแช่แข็งโมดูลปัจจุบันเพื่อ requirements.txt
Hugo

@Hugo: ฉันจะใช้saveชื่อ
Anatoly techtonik

5
การตั้งชื่อของ 'หยุด' เป็นประวัติศาสตร์ - มันวันที่กลับไปอย่างน้อย 2008 ในเวลานั้นหลายคนคุ้นเคยกับพลอยทับทิม "แช่แข็ง" ดังนั้น pip จึงยืมชื่อที่ใช้กันอย่างแพร่หลายในตอนนั้น
AdamKG

2
นี่ไม่ชัดเจนหรือไม่มีเอกสาร แต่คุณสามารถพิมพ์pip show pipเพื่อรับข้อมูลเวอร์ชั่นของ pip ได้มากกว่าpip --versionที่ฉันคาดไว้
Marc Maxmeister

pip freezeมีข้อได้เปรียบที่จะแสดงเวอร์ชันเช็คเอาต์ของ VCS ที่แก้ไขได้อย่างถูกต้องในขณะที่pip showไม่มี
spookylukey

63

ฉันเพิ่งส่งคำขอดึงใน pip ด้วยการปรับปรุง Hugo Tavares กล่าวว่า:

(specloud เป็นตัวอย่าง)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

2
ดูเหมือนว่ามันจะถูกผสานแล้ว
Anatoly techtonik

43

ตอนนี้ Pip 1.3 ยังมีคำสั่งlist :

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

พูดชื่อแพ็คเกจว่าเป็น X หากต้องการค้นหาเวอร์ชัน - อะไรคือความแตกต่างระหว่างการใช้รายการ pip และทำการอิมพอร์ต X และ X .__ version__? มีทั้งเวอร์ชันแพ็คเกจหรือไม่
ตัวแปร

ทั้งสองถูกต้อง แต่pip listเป็นทั่วไปและ__version__ไม่ ฉันได้เห็นversion()และget_version()นำเข้าอย่างใดอย่างหนึ่ง
RickyA

35

และด้วย - ล้าสมัยเป็นอาร์กิวเมนต์พิเศษคุณจะได้รับแพคเกจปัจจุบันและเวอร์ชันล่าสุดที่คุณใช้:

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

ดังนั้นเมื่อรวมกับคำตอบของ AdamKG:

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

ตรวจสอบเครื่องมือ pipด้วย: https://github.com/nvie/pip-tools


1
ตัวเลือกที่น่าสนใจ ฉันอยากให้มันเขียนรายการทั้งหมดและแจ้งให้เราทราบหากมีรายการใดล้าสมัย
ArtOfWarfare

17

คุณยังสามารถติดตั้งyolkแล้วเรียกใช้yolk -lซึ่งให้ผลลัพธ์ที่ดี นี่คือสิ่งที่ฉันได้รับสำหรับ virtualenv ตัวน้อยของฉัน:

(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

คุณสามารถใช้คำสั่ง grep เพื่อค้นหา

pip show <package_name>|grep Version

ตัวอย่าง:

pip show urllib3|grep Version

จะแสดงเฉพาะรุ่น

ข้อมูลเมตารุ่น: 2.0
เวอร์ชัน: 1.12


8

วิธีที่ง่ายที่สุดคือ:

import jinja2
print jinja2.__version__

7
ใช้งานได้กับแพ็คเกจที่กำหนดไว้__version__ในซอร์สโค้ดเท่านั้น แพ็คเกจจำนวนมากทำไม่ได้
spookylukey

เป็นการดีที่จะรวมรุ่นนี้ในขณะที่บรรจุภัณฑ์หรือเป็นวิธีปฏิบัติที่ดีที่จะมีเฉพาะรุ่นในพารามิเตอร์เวอร์ชันไฟล์ setup.py
ตัวแปร

วิธีนี้ยังไม่ได้มีประสิทธิภาพในการจัดแพคเกจการตั้งชื่อไม่สอดคล้องกัน (มีอย่างน้อย 3 ชนิด) ระหว่างการป้อนข้อมูลที่คาดหวังของและการส่งออกของimport pip freeze
mirekphd

6

นอกจากนี้ยังมีเครื่องมือที่เรียกว่าpip-checkซึ่งให้ภาพรวมอย่างรวดเร็วของแพ็คเกจที่ติดตั้งทั้งหมดและสถานะการอัพเดท:

ป้อนคำอธิบายรูปภาพที่นี่

ยังไม่ได้ใช้มันเอง เพิ่งสะดุดเมื่อมันและคำถามนี้ดังนั้นอย่างต่อเนื่องอย่างรวดเร็วและเนื่องจากมันไม่ได้กล่าวถึง ...


วิธีเรียกใช้บน windows
vela

1
@vela ฉันคาดหวังว่ามันจะทำงานได้เหมือนกันทุกประการบน Windows แน่นอนคุณจะต้องติดตั้งครั้งแรกเช่นเดียวกับที่คุณทำในระบบใด ๆ
Ola Tuvesson


2

ฟังก์ชั่นหลามส่งกลับเฉพาะรุ่นแพ็คเกจในรูปแบบที่เครื่องอ่านได้:

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

ก่อนหน้าไพ ธ อน 3.8:

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

bash ที่เทียบเท่า (ที่นี่ยังเรียกจาก python) จะซับซ้อนมากขึ้น (แต่แข็งแกร่งมากขึ้น - ดูข้อควรระวังด้านล่าง):

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())

ตัวอย่างการใช้งาน:

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

print(get_installed_ver(pkg_name))
>>> 0.22

โปรดสังเกตว่าในทั้งสองกรณีpkg_nameพารามิเตอร์ควรมีชื่อแพคเกจในรูปแบบที่ส่งกลับโดยpip freezeและไม่เป็นที่ใช้ในระหว่างimportเช่นscikit-learnไม่ได้sklearnหรือไม่Flask-Cachingflask_caching

โปรดทราบว่าในขณะที่กล่าวอ้างpip freezeในรุ่นทุบตีอาจดูเหมือนไม่มีประสิทธิภาพเพียงวิธีนี้พิสูจน์ให้เป็นที่แข็งแกร่งพอที่จะจัดแพคเกจการตั้งชื่อพิสดารและไม่สอดคล้องกัน (เช่นขีด VS ขีดกลางขนาดเล็ก VS แคปขนาดใหญ่และตัวย่อเช่นsklearnVS scikit-learn)

ข้อควรระวัง: ในสภาพแวดล้อมที่ซับซ้อนตัวแปรทั้งสองสามารถส่งคืนหมายเลขเวอร์ชันของเซอร์ไพรส์ซึ่งไม่สอดคล้องกับสิ่งที่คุณจะได้รับในระหว่างimportนั้น

ปัญหาดังกล่าวเกิดขึ้นเมื่อมีแพ็คเกจรุ่นอื่นซ่อนอยู่ในโฟลเดอร์ย่อยของผู้ใช้ site-packagesในฐานะที่เป็นตัวอย่างของอันตรายจากการใช้version()ที่นี่เป็นสถานการณ์ที่ฉันพบ:

$ 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

ปัญหาอีกประการหนึ่งคือการมีแพ็คเกจที่ติดตั้ง Conda ในสภาพแวดล้อมเดียวกัน หากพวกเขาแบ่งปันการพึ่งพากับแพ็คเกจที่ติดตั้ง pip ของคุณและเวอร์ชันของการพึ่งพาเหล่านี้แตกต่างกันคุณอาจได้รับการลดระดับการอ้างอิงที่ติดตั้ง pip ของคุณ

เพื่อแสดงให้เห็นว่าเวอร์ชั่นล่าสุดของnumpyPyPI ในวันที่ 04-01-2020 คือ 1.18.0 ในขณะเดียวกันconda-forgeช่องของ Anaconda ก็มีเวอร์ชั่น 1.17.3 เพียงเวอร์ชั่นnumpyเดียวเท่านั้น ดังนั้นเมื่อคุณติดตั้งbasemapแพคเกจที่มี conda (เป็นวินาที) pip ที่ติดตั้งไว้ก่อนหน้าของคุณnumpyจะถูกลดระดับโดย conda เป็น 1.17.3 และเวอร์ชั่น 1.18.0 จะไม่สามารถใช้งานได้ในimportฟังก์ชั่น ในกรณีนี้version()จะถูกต้องและpip freeze/ conda listผิด:

$ 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
ทำไมไม่ใช้importlib.metadata.version('NameOfProject')? docs.python.org/3/library/…
sinoroc

1
สุดยอด find @sinoroc! ฉันคิดว่าคุณควรโพสต์มันเป็นคำตอบและฉันจะลบหนึ่งที่ค่อนข้าง overengineered ของฉัน :) ตัวอย่าง PoC: from importlib_metadata import version; version('Flask-Caching')
mirekphd

1
ฉันจะปล่อยให้คุณไปมัน
sinoroc

การแก้ไขล่าสุดของคุณทำให้ฉันประหลาดใจ คุณลองได้python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"ไหม
sinoroc

อันนั้นให้คำตอบที่ถูกต้อง - เวอร์ชั่นล่าสุดที่ติดตั้ง (2.3.1) เมื่อversion()ยังส่งคืนคำตอบที่เก่าที่สุด (เก่าที่สุด) หนึ่ง (2.2.3) คุณสามารถทำซ้ำผลนี้โดยการติดตั้งทั้งสองรุ่นที่มี--userสวิทช์ แต่การรักษาด้วยตนเองlightgbm-2.2.3.dist-infoโฟลเดอร์ที่จะมีทั้งของพวกเขาร่วมกันตามที่ระบุไว้ข้างต้น (pip จะปกติเอามัน - จนกว่ามันจะไม่ได้)
mirekphd

1

pip แสดงการทำงานในหลาม 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:

มันไม่ใช่คำตอบมาตรฐาน
hamed baziyad

1

ในการทำเช่นนี้โดยใช้รหัส Python:

การใช้ importlib.metadata.version

Python .83.8

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

Python .73.7

(ใช้importlib_metadata.version)

!pip install importlib-metadata

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

การใช้ 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')>

เครดิตการแสดงความคิดเห็นโดยsinorocและmirekphd


0

สำหรับ Windows คุณสามารถ

  1. เปิด cmd และพิมพ์ python กด Enter

  2. พิมพ์การนำเข้าและกด Enter

  3. พิมพ์. _version__ แล้วกด Enter

อย่างที่คุณเห็นใน screen shot ที่นี่ฉันใช้วิธีนี้เพื่อตรวจสอบเวอร์ชั่นของโมดูลอนุกรม

ภาพ



0

ในคำถามจะไม่กล่าวถึงผู้ใช้ระบบปฏิบัติการที่ใช้ (Windows / Linux / Mac)

เนื่องจากมีสองคำตอบที่จะทำงานได้อย่างไม่มีที่ติบน Mac และ Linux

คำสั่งด้านล่างสามารถใช้ในกรณีที่ผู้ใช้พยายามค้นหาเวอร์ชันของแพ็กเกจหลามบน windows

ใน PowerShell ใช้คำสั่งด้านล่าง:

pip list | findstr <PackageName>

ตัวอย่าง:- pip list | findstr requests

ผลผลิต: requests 2.18.4

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.