web-dev-qa-db-fra.com

Vérifiez si mon Python possède tous les packages requis

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?

24
Alagappan Ramu

[~ # ~] 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)
48
Zaur Nasibov

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.

19
John Jiang

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
7
Acumenus

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.)

0
cov