Compruebe si mi Python tiene todos los paquetes requeridos

Tengo un archivo Requirements.txt con una lista de paquetes que se requieren para mi entorno virtual. ¿Es posible averiguar si todos los paquetes mencionados en el archivo están presentes? Si faltan algunos paquetes, ¿cómo saber cuáles son los paquetes faltantes?

La forma en que Pythonic lo hace es a través de la API pkg_resources . Los requisitos están escritos en un formato comprendido por setuptools. P.ej:

 Werkzeug>=0.6.1 Flask Django>=1.3 

El código de ejemplo:

 import pkg_resources from pkg_resources import DistributionNotFound, VersionConflict # dependencies can be any iterable with strings, # eg file line-by-line iterator dependencies = [ 'Werkzeug>=0.6.1', 'Flask>=0.9', ] # here, if a dependency is not met, a DistributionNotFound or VersionConflict # exception is thrown. pkg_resources.require(dependencies) 

Puede ejecutar pip freeze para ver lo que ha instalado y compararlo con su archivo Requirements.txt.

Si desea instalar los módulos faltantes, puede ejecutar pip install -r requirements.txt y eso instalará los módulos faltantes y le dirá al final cuáles faltaron e instalaron.

Basado en la respuesta de Zaur , suponiendo que de hecho use un archivo tests/test_requirements.py , es posible que desee una prueba de unidad, tal vez en tests/test_requirements.py , que confirme la disponibilidad de paquetes.

Este enfoque utiliza una subprueba para confirmar de forma independiente cada requisito. Esto es útil para que todos los fallos estén documentados.

 from pathlib import Path import unittest import pkg_resources class TestRequirements(unittest.TestCase): def test_requirements(self): """Recursively confirm that requirements are available.""" # Ref: https://stackoverflow.com/a/45474387/ requirements = (Path(__file__).parents[1] / 'requirements.in').read_text().strip().split('\n') requirements = [r.strip() for r in requirements] requirements = [r for r in sorted(requirements) if r and not r.startswith('#')] for requirement in requirements: with self.subTest(requirement=requirement): pkg_resources.require(requirement) 

Puede crear un virtualenv con acceso a los paquetes del sitio del sistema y comprobar si el paquete (u otras dependencias) están instalados o no. De esta manera, los paquetes no se instalan realmente (si solo quiere verificar). Un ejemplo usando virtualenv wrapper sería:

 $ cat requirements.txt requests simplejson $ mkvirtualenv --system-site-packages test Running virtualenv with interpreter /usr/bin/python2 New python executable in test/bin/python2 Also creating executable in test/bin/python Installing setuptools, pip...done. $ pip install -r requirements.txt Downloading/unpacking requests (from -r requirements.txt (line 1)) Downloading requests-2.10.0-py2.py3-none-any.whl (506kB): 506kB downloaded Requirement already satisfied (use --upgrade to upgrade): simplejson in /usr/lib/python2.7/dist-packages (from -r requirements.txt (line 2)) Installing collected packages: requests Successfully installed requests Cleaning up... $ pip install -r requirements.txt Requirement already satisfied (use --upgrade to upgrade): requests in /home/yucer/.virtualenvs/test/lib/python2.7/site-packages (from -r requirements.txt (line 1)) Requirement already satisfied (use --upgrade to upgrade): simplejson in /usr/lib/python2.7/dist-packages (from -r requirements.txt (line 2)) Cleaning up... $ deactivate $ rmvirtualenv test Removing test... 

Si Requirements.txt es como:

 django oursql sys notexistingmodule 

Luego, el siguiente script le dirá qué módulos faltan:

 #!/usr/bin/python3 fname = 'requirements.txt' with open(fname, 'r', encoding='utf-8') as fhd: for line in fhd: try: exec("import " + line) except: print("[ERROR] Missing module:", line) 

Esto imprimiría:

 [ERROR] Missing module: notexistingmodule