ฟังก์ชั่นหลามส่งกลับเฉพาะรุ่นแพ็คเกจในรูปแบบที่เครื่องอ่านได้:
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-Caching
flask_caching
โปรดทราบว่าในขณะที่กล่าวอ้างpip freeze
ในรุ่นทุบตีอาจดูเหมือนไม่มีประสิทธิภาพเพียงวิธีนี้พิสูจน์ให้เป็นที่แข็งแกร่งพอที่จะจัดแพคเกจการตั้งชื่อพิสดารและไม่สอดคล้องกัน (เช่นขีด VS ขีดกลางขนาดเล็ก VS แคปขนาดใหญ่และตัวย่อเช่นsklearn
VS 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 ของคุณ
เพื่อแสดงให้เห็นว่าเวอร์ชั่นล่าสุดของnumpy
PyPI ในวันที่ 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
show
คำสั่งใน pip: github.com/pypa/pip/issues/33