คำตอบที่อัปเดต
วิธีที่ดีกว่านี้คือ:
import subprocess
import sys
reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]
ผลลัพธ์:
print(installed_packages)
[
"Django",
"six",
"requests",
]
ตรวจสอบว่าrequests
ติดตั้งแล้ว:
if 'requests' in installed_packages:
# Do something
ทำไมต้องเป็นแบบนี้? บางครั้งคุณมีการชนกันของชื่อแอป การนำเข้าจากเนมสเปซของแอปไม่ได้ให้ภาพรวมของสิ่งที่ติดตั้งในระบบ
โปรดทราบว่าโซลูชันที่เสนอนั้นใช้ได้ผล:
- เมื่อใช้ pip เพื่อติดตั้งจาก PyPI หรือจากแหล่งอื่น ๆ (เช่น
pip install http://some.site/package-name.zip
หรือประเภทไฟล์เก็บถาวรอื่น ๆ )
- เมื่อติดตั้งด้วยตนเองโดยใช้
python setup.py install
.
- เมื่อติดตั้งจากที่เก็บระบบเช่น
sudo apt install python-requests
.
กรณีที่อาจเกิดขึ้น ไม่ได้ผล:
- เมื่อติดตั้งในโหมดการพัฒนาเช่น
python setup.py develop
.
- เมื่อติดตั้งในโหมดการพัฒนาเช่น
pip install -e /path/to/package/source/
.
คำตอบเก่า
วิธีที่ดีกว่านี้คือ:
import pip
installed_packages = pip.get_installed_distributions()
สำหรับ pip> = 10.x ใช้:
from pip._internal.utils.misc import get_installed_distributions
ทำไมต้องเป็นแบบนี้? บางครั้งคุณมีการชนกันของชื่อแอป การนำเข้าจากเนมสเปซของแอปไม่ได้ให้ภาพรวมของสิ่งที่ติดตั้งในระบบ
เป็นผลให้คุณได้รับรายการpkg_resources.Distribution
วัตถุ ดูตัวอย่างต่อไปนี้:
print installed_packages
[
"Django 1.6.4 (/path-to-your-env/lib/python2.7/site-packages)",
"six 1.6.1 (/path-to-your-env/lib/python2.7/site-packages)",
"requests 2.5.0 (/path-to-your-env/lib/python2.7/site-packages)",
]
จัดทำรายการ:
flat_installed_packages = [package.project_name for package in installed_packages]
[
"Django",
"six",
"requests",
]
ตรวจสอบว่าrequests
ติดตั้งแล้ว:
if 'requests' in flat_installed_packages:
# Do something