Resposta atualizada
A melhor maneira de fazer isso é:
import subprocess
import sys
reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]
O resultado:
print(installed_packages)
[
"Django",
"six",
"requests",
]
Verifique se requests
está instalado:
if 'requests' in installed_packages:
# Do something
Por que assim? Às vezes, você tem conflitos de nomes de aplicativos. Importar do namespace do aplicativo não fornece uma imagem completa do que está instalado no sistema.
Observe que a solução proposta funciona:
- Ao usar o pip para instalar a partir do PyPI ou de qualquer outra fonte alternativa (como
pip install http://some.site/package-name.zip
ou qualquer outro tipo de arquivo).
- Ao instalar manualmente usando
python setup.py install
.
- Ao instalar a partir de repositórios do sistema, como
sudo apt install python-requests
.
Casos em que pode não funcionar:
- Ao instalar em modo de desenvolvimento, como
python setup.py develop
.
- Ao instalar em modo de desenvolvimento, como
pip install -e /path/to/package/source/
.
Resposta antiga
A melhor maneira de fazer isso é:
import pip
installed_packages = pip.get_installed_distributions()
Para pip> = 10.x, use:
from pip._internal.utils.misc import get_installed_distributions
Por que assim? Às vezes, você tem conflitos de nomes de aplicativos. Importar do namespace do aplicativo não fornece uma imagem completa do que está instalado no sistema.
Como resultado, você obtém uma lista de pkg_resources.Distribution
objetos. Veja o seguinte como exemplo:
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)",
]
Faça uma lista disso:
flat_installed_packages = [package.project_name for package in installed_packages]
[
"Django",
"six",
"requests",
]
Verifique se requests
está instalado:
if 'requests' in flat_installed_packages:
# Do something