更新答案
一个更好的方法是:
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