Temukan versi paket mana yang diinstal dengan pip

710

Menggunakan pip, apakah mungkin untuk mengetahui versi paket mana yang saat ini diinstal?

Saya tahu pip install XYZ --upgradetetapi saya bertanya-tanya apakah ada yang seperti itu pip info XYZ. Jika tidak, apa yang akan menjadi cara terbaik untuk mengetahui versi apa yang saya gunakan saat ini.

Alexis
sumber
4
ada proposal untuk showperintah di pip: github.com/pypa/pip/issues/33
Hugo Tavares

Jawaban:

1014

Pada pip 1.3 , ada pip showperintah.

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

Dalam versi yang lebih lama, pip freezedan grepharus melakukan pekerjaan dengan baik.

$ pip freeze | grep Jinja2
Jinja2==2.7.3
AdamKG
sumber
8
@ techtonik: Ini untuk membekukan modul saat ini ke requirement.txt.
Hugo
@ Hugo: Saya akan menggunakan savenama.
anatoly techtonik
5
Penamaan 'pembekuan' adalah historis - tanggal kembali setidaknya 2008 . Pada saat itu, banyak orang sudah akrab dengan permata ruby ​​"beku", jadi pip meminjam nama yang saat itu banyak digunakan.
AdamKG
2
ini tidak jelas atau tidak didokumentasikan, tetapi Anda dapat mengetik pip show pipuntuk mendapatkan info versi pip, daripada pip --versionseperti yang saya harapkan.
Marc Maxmeister
pip freezememiliki keuntungan karena menunjukkan versi checkout VCS yang dapat diedit dengan benar, sementara pip showtidak.
spookylukey
63

Saya baru saja mengirim permintaan tarik di pip dengan perangkat tambahan Hugo Tavares berkata:

(specloud sebagai contoh)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
BernardoBarreto
sumber
2
Sepertinya sudah digabung .
anatoly techtonik
43

Pip 1.3 sekarang juga memiliki perintah daftar :

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
RickyA
sumber
Katakanlah nama paket adalah X. Untuk menemukan versi - Apa perbedaan antara menggunakan daftar pipa dan melakukan impor X dan kemudian X .__ versi__? Apakah keduanya versi paket?
variabel
keduanya valid, tetapi pip listgenerik, dan __version__tidak. Saya juga telah melihat version()dan get_version()untuk yang diimpor.
RickyA
35

dan dengan --outdated sebagai argumen tambahan, Anda akan mendapatkan versi Saat ini dan Terbaru dari paket yang Anda gunakan:

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

Jadi menggabungkan dengan jawaban AdamKG:

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

Periksa juga pip-tools : https://github.com/nvie/pip-tools

KevinS
sumber
1
Opsi yang menarik. Saya lebih suka daftar semua dari mereka, dan biarkan saya tahu jika ada dari mereka yang sudah ketinggalan zaman.
ArtOfWarfare
17

Anda juga dapat menginstal yolkdan menjalankan yolk -lyang juga memberikan output yang bagus. Inilah yang saya dapatkan untuk virtualenv kecil saya:

(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 
Gustavo
sumber
9

Anda dapat menggunakan perintah grep untuk mengetahuinya.

pip show <package_name>|grep Version

Contoh:

pip show urllib3|grep Version

hanya akan menampilkan versi.

Metadata-Versi: 2.0
Versi: 1.12

Rajiv
sumber
8

Cara termudah adalah ini:

import jinja2
print jinja2.__version__
pengguna5730083
sumber
7
Ini hanya berfungsi untuk paket yang telah ditentukan __version__dalam kode sumbernya. Banyak paket tidak.
spookylukey
Apakah praktik yang baik untuk memasukkan versi ini saat pengemasan atau praktik yang baik untuk hanya memiliki versi dalam parameter versi file setup.py?
variabel
Metode ini juga tidak kuat untuk paket inkonsistensi penamaan (setidaknya ada 3 jenis) antara input yang diharapkan importdan output pip freeze.
mirekphd
6

Ada juga alat yang disebut pip-checkyang memberi Anda gambaran umum singkat dari semua paket yang diinstal dan status pembaruan mereka:

masukkan deskripsi gambar di sini

Belum pernah menggunakannya sendiri; hanya tersandung padanya dan pertanyaan SO ini berturut-turut cepat, dan karena itu tidak disebutkan ...

Ola Tuvesson
sumber
Cara menjalankan ini di windows
vela
1
@vela Saya berharap ini akan bekerja sama persis pada Windows. Tentu saja Anda harus menginstalnya terlebih dahulu, seperti yang Anda lakukan pada sistem apa pun.
Ola Tuvesson
5

Di windows, Anda dapat mengeluarkan perintah seperti:

pip show setuptools | findstr "Version"

Keluaran:

Version: 34.1.1
Quinn
sumber
2

Fungsi python mengembalikan hanya versi paket dalam format yang dapat dibaca mesin:

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

Sebelum ke python 3.8:

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

Setara bash (di sini juga dipanggil dari python) akan jauh lebih kompleks (tetapi lebih kuat - lihat kehati-hatian di bawah):

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

Penggunaan sampel:

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

print(get_installed_ver(pkg_name))
>>> 0.22

Perhatikan bahwa dalam kedua kasus pkg_nameparameter harus berisi nama paket dalam format yang dikembalikan oleh pip freezedan tidak seperti yang digunakan selama import, misalnya scikit-learntidak sklearnatau Flask-Caching, tidak flask_caching.

Perhatikan bahwa sementara menjalankan pip freezedalam versi bash mungkin tampak tidak efisien, hanya metode ini terbukti cukup kuat untuk mengemas kekhasan dan inkonsistensi penamaan paket (misalnya menggarisbawahi garis putus-putus, huruf kecil vs besar, dan singkatan seperti sklearnvs scikit-learn).

Perhatian: di lingkungan yang kompleks kedua varian dapat mengembalikan nomor versi kejutan, tidak konsisten dengan apa yang sebenarnya Anda dapatkan selama import.

Salah satu masalah seperti itu muncul ketika ada versi lain dari paket yang disembunyikan dalam subfolder pengguna site-packages . Sebagai ilustrasi bahaya menggunakan version()inilah situasi yang saya temui:

$ 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

Masalah lain adalah memiliki beberapa paket yang diinstal-konda di lingkungan yang sama. Jika mereka berbagi dependensi dengan paket-paket yang Anda instal dengan pip, dan versi-versi dari dependensi ini berbeda, Anda dapat menurunkan versi dependensi yang diinstal oleh pip Anda.

Sebagai ilustrasi, versi terbaru yang numpytersedia di PyPI pada 04-01-2020 adalah 1.18.0, sementara pada saat yang sama conda-forgesaluran Anaconda hanya memiliki versi 1.17.3 numpysebagai yang terbaru. Jadi ketika Anda menginstal basemappaket dengan conda (sebagai yang kedua), pip-instal Anda sebelumnya numpyakan diturunkan oleh conda ke 1.17.3, dan versi 1.18.0 tidak akan tersedia untuk importfungsi tersebut. Dalam hal ini version()akan benar, dan pip freeze/ conda listsalah:

$ 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
mirekphd
sumber
1
Kenapa tidak digunakan importlib.metadata.version('NameOfProject')? docs.python.org/3/library/…
sinoroc
1
Temukan @sinoroc! Saya pikir Anda harus mempostingnya sebagai jawaban, dan saya akan menghapus yang saya agak overengineered :) Contoh PoC: from importlib_metadata import version; version('Flask-Caching')
mirekphd
1
Saya akan membiarkan Anda melakukannya
sinoroc
Hasil edit terbaru Anda mengejutkan saya. Bisakah kamu mencoba python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"?
sinoroc
Yang memberi Anda jawaban yang benar - versi terbaru diinstal (2.3.1), ketika version()masih mengembalikan yang paling awal (tertua) (2.2.3). Anda dapat mereplikasi hasil ini dengan menginstal kedua versi dengan --userswitch, tetapi menjaga secara manual lightgbm-2.2.3.dist-infofolder, agar keduanya bersama-sama, seperti yang tercantum di atas (pip biasanya akan menghapusnya - sampai tidak).
mirekphd
1

pip show bekerja dengan 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:
Superstone
sumber
Itu bukan jawaban standar.
hamed baziyad
1

Untuk melakukan ini menggunakan kode Python:

Menggunakan importlib.metadata.version

Python ≥3.8

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

Python ≤3.7

(menggunakan importlib_metadata.version)

!pip install importlib-metadata

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

Menggunakan 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')>

Dikreditkan ke komentar oleh sinoroc dan mirekphd .

Acumenus
sumber
0

Untuk Windows Anda bisa

  1. buka cmd dan ketik python, tekan enter.

  2. ketik impor dan tekan enter.

  3. ketik ._version__ dan tekan enter.

Seperti yang dapat Anda lihat di screen shot di sini saya menggunakan metode ini untuk memeriksa versi modul serial.

Gambar


joker2368
sumber
0

Dalam pertanyaan, tidak disebutkan pengguna OS mana yang menggunakan (Windows / Linux / Mac)

Karena ada beberapa jawaban yang akan bekerja dengan sempurna di Mac dan Linux.

Perintah di bawah ini dapat digunakan jika pengguna mencoba menemukan versi paket python di windows.

Di PowerShell gunakan perintah di bawah ini:

pip list | findstr <PackageName>

Contoh:- pip list | findstr requests

Keluaran: requests 2.18.4

Ashwani Singh
sumber