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
showperintah di pip: github.com/pypa/pip/issues/33