De nombreux modules tiers Python) ont un attribut qui contient les informations de version du module (généralement quelque chose comme module.VERSION
ou module.__version__
), mais certains ne le font pas.
Les exemples particuliers de tels modules sont libxslt et libxml2.
Je dois vérifier que la version correcte de ces modules est utilisée au moment de l'exécution. Y a-t-il un moyen de faire cela?
Une solution potentielle serait de lire le source au moment de l'exécution, de le hacher, puis de le comparer au hachage de la version connue, mais c'est méchant.
Y a-t-il de meilleures solutions?
Je resterais loin de hachage. La version de libxslt utilisée peut contenir un type de correctif qui n’affecte pas votre utilisation.
En guise d'alternative, j'aimerais suggérer que vous ne vérifiiez pas au moment de l'exécution (ne savez pas si c'est une exigence difficile ou non). Pour le python que j'écris et qui a des dépendances externes (bibliothèques tierces), j'écris un script que les utilisateurs peuvent exécuter pour vérifier leur python installer pour voir si les versions appropriées des modules sont installées.
Pour les modules qui n'ont pas d'attribut "version" défini, vous pouvez inspecter les interfaces qu'il contient (classes et méthodes) et voir si elles correspondent à l'interface attendue. Ensuite, dans le code sur lequel vous travaillez, supposez que les modules tiers possèdent l'interface que vous attendez.
Utilisez pkg_resources . Tout ce qui est installé depuis PyPI au moins devrait avoir un numéro de version.
>>> import pkg_resources
>>> pkg_resources.get_distribution("blogofile").version
'0.7.1'
Quelques idées:
Vous pouvez utiliser
pip freeze
pour voir les packages installés au format des exigences.
Vous pouvez utiliser importlib_metadata
bibliothèque pour cela.
Si vous êtes sur python <3.8
, installez-le d'abord avec:
pip install importlib_metadata
Depuis python 3.8
il est inclus dans la bibliothèque standard de python.
Ensuite, pour vérifier la version d'un paquet (dans cet exemple, lxml
), exécutez:
>>> from importlib_metadata import version
>>> version('lxml')
'4.3.1'
Gardez à l'esprit que cela ne fonctionne que pour les packages installés à partir de PyPI. En outre, vous devez passer un nom de package en tant qu'argument à la méthode version
, plutôt qu'un nom de module fourni par ce package (bien qu'ils soient généralement identiques).
J'ai trouvé assez peu fiable d'utiliser les divers outils disponibles (y compris le meilleur pkg_resources
Mentionné par cette autre réponse ), car la plupart d'entre eux ne couvrent pas tous les cas. Par exemple
Comme nous avions besoin d’un moyen fiable d’obtenir la version de n’importe quel package, module ou sous-module , j’ai fini par écrire getversion . C'est assez simple à utiliser:
from getversion import get_module_version
import foo
version, details = get_module_version(foo)
Voir le documentation pour plus de détails.