web-dev-qa-db-fra.com

Vérification de la version du module Python à l'exécution)

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?

108
Gruff

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.

6
Mark Roddy

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'
230
EnigmaCurry

Quelques idées:

  1. Essayez de vérifier les fonctions qui existent ou n'existent pas dans les versions dont vous avez besoin.
  2. S'il n'y a pas de différence de fonction, inspectez les arguments et les signatures de la fonction.
  3. Si vous ne parvenez pas à comprendre les signatures de fonction, configurez des appels de talon au moment de l'importation et vérifiez leur comportement.
6

Vous pouvez utiliser

pip freeze

pour voir les packages installés au format des exigences.

2
nos

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

1
Jakub Kukul

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

  • modules intégrés
  • modules non installés mais ajoutés au chemin python (par votre IDE par exemple)
  • deux versions du même module disponible (une dans python chemin remplaçant celle installée)

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.

0
smarie