J'ai un requirements.txt
fichier avec une liste des packages requis pour mon environnement virtuel. Est-il possible de savoir si tous les packages mentionnés dans le fichier sont présents? Si certains packages sont manquants, comment savoir quels sont les packages manquants?
[~ # ~] mise à jour [~ # ~] :
Une façon à jour et améliorée de le faire est via distutils.text_file.TextFile
. Voir Acumenus ' réponse ci-dessous pour plus de détails.
[~ # ~] original [~ # ~] :
La façon Pythonique de le faire est via le pkg_resources
API . Les exigences sont écrites dans un format compris par setuptools. Par exemple:
Werkzeug>=0.6.1
Flask
Django>=1.3
L'exemple de code:
import pkg_resources
from pkg_resources import DistributionNotFound, VersionConflict
# dependencies can be any iterable with strings,
# e.g. 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)
Tu peux courir pip freeze
pour voir ce que vous avez installé et le comparer à votre requirements.txt
fichier.
Si vous souhaitez installer des modules manquants, vous pouvez exécuter pip install -r requirements.txt
et cela installera tous les modules manquants et vous indiquera à la fin ceux qui manquaient et installés.
Basé sur le réponse de Zaur , en supposant que vous utilisez bien un fichier d'exigences, vous voudrez peut-être un test unitaire, peut-être dans tests/test_requirements.py
, qui confirme la disponibilité des packages.
De plus, cette approche utilise un sous-test pour confirmer indépendamment chaque exigence. Ceci est utile pour que toutes les pannes soient documentées.
"""Test availability of required packages."""
import distutils.text_file
import unittest
from pathlib import Path
import pkg_resources
_REQUIREMENTS_PATH = Path(__file__).parent.with_name("requirements.txt")
class TestRequirements(unittest.TestCase):
"""Test availability of required packages."""
def test_requirements(self):
"""Test that each required package is available."""
# Ref: https://stackoverflow.com/a/45474387/
requirements = distutils.text_file.TextFile(filename=str(_REQUIREMENTS_PATH)).readlines()
for requirement in requirements:
with self.subTest(requirement=requirement):
pkg_resources.require(requirement)
Notez que distutils.text_file.TextFile
supprimera les commentaires.
Notez que Python 3 comprend bien sûr distutils.text_file
:
>>> import sys
>>> sys.version
'3.8.0 (default, Oct 28 2019, 16:14:01) \n[GCC 8.3.0]'
>>> sys.modules['distutils.text_file']
<module 'distutils.text_file' from '/usr/lib/python3.8/distutils/text_file.py'>
>>> import distutils.text_file
Si cela vous intéresse depuis la ligne de commande, pip-missing-reqs
listera les paquets manquants. Exemple:
$ pip-missing-reqs directory
Missing requirements:
directory/exceptions.py:11 dist=grpcio module=grpc
(pip check
et pipdeptree --warn fail
vérifie uniquement la compatibilité des packages installés, sans vérifier requirements.txt
.)