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