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_name
parameter harus berisi nama paket dalam format yang dikembalikan oleh pip freeze
dan tidak seperti yang digunakan selama import
, misalnya scikit-learn
tidak sklearn
atau Flask-Caching
, tidak flask_caching
.
Perhatikan bahwa sementara menjalankan pip freeze
dalam 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 sklearn
vs 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 numpy
tersedia di PyPI pada 04-01-2020 adalah 1.18.0, sementara pada saat yang sama conda-forge
saluran Anaconda hanya memiliki versi 1.17.3 numpy
sebagai yang terbaru. Jadi ketika Anda menginstal basemap
paket dengan conda (sebagai yang kedua), pip-instal Anda sebelumnya numpy
akan diturunkan oleh conda ke 1.17.3, dan versi 1.18.0 tidak akan tersedia untuk import
fungsi tersebut. Dalam hal ini version()
akan benar, dan pip freeze
/ conda list
salah:
$ 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
show
perintah di pip: github.com/pypa/pip/issues/33