Cập nhật câu trả lời
Một cách tốt hơn để làm điều này là:
import subprocess
import sys
reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]
Kết quả:
print(installed_packages)
[
"Django",
"six",
"requests",
]
Kiểm tra xem đã requests
được cài đặt chưa:
if 'requests' in installed_packages:
# Do something
Tại sao lại theo cách này? Đôi khi bạn có xung đột tên ứng dụng. Nhập từ không gian tên ứng dụng không cung cấp cho bạn bức tranh đầy đủ về những gì được cài đặt trên hệ thống.
Lưu ý, giải pháp được đề xuất đó hoạt động:
- Khi sử dụng pip để cài đặt từ PyPI hoặc từ bất kỳ nguồn thay thế nào khác (như
pip install http://some.site/package-name.zip
hoặc bất kỳ loại lưu trữ nào khác).
- Khi cài đặt thủ công bằng cách sử dụng
python setup.py install
.
- Khi cài đặt từ kho hệ thống, như
sudo apt install python-requests
.
Các trường hợp khi nó có thể không hoạt động:
- Khi cài đặt ở chế độ phát triển, thích
python setup.py develop
.
- Khi cài đặt ở chế độ phát triển, thích
pip install -e /path/to/package/source/
.
Câu trả lời cũ
Một cách tốt hơn để làm điều này là:
import pip
installed_packages = pip.get_installed_distributions()
Đối với pip> = 10.x sử dụng:
from pip._internal.utils.misc import get_installed_distributions
Tại sao lại theo cách này? Đôi khi bạn có xung đột tên ứng dụng. Nhập từ không gian tên ứng dụng không cung cấp cho bạn bức tranh đầy đủ về những gì được cài đặt trên hệ thống.
Kết quả là, bạn nhận được một danh sách các pkg_resources.Distribution
đối tượng. Xem ví dụ sau:
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)",
]
Lập danh sách về nó:
flat_installed_packages = [package.project_name for package in installed_packages]
[
"Django",
"six",
"requests",
]
Kiểm tra xem đã requests
được cài đặt chưa:
if 'requests' in flat_installed_packages:
# Do something