2009-04-02 7 views
98

De nombreux modules Python tiers possèdent un attribut qui contient les informations de version du module (généralement module.VERSION ou module.__version__), mais pas tous.Vérification d'une version de module Python à l'exécution

Des exemples particuliers de tels modules sont libxslt et libxml2.

Je dois vérifier que la version correcte de ces modules est utilisée lors de l'exécution. Y a-t-il un moyen de faire cela?

Une solution potentielle serait de lire dans la source lors de l'exécution, de la hacher, puis de la comparer au hachage de la version connue, mais c'est méchant.

Existe-t-il de meilleures solutions?

Répondre

7

Je resterais loin du hachage. La version de libxslt utilisée peut contenir un type de patch qui n'affecte pas votre utilisation. Comme alternative, je voudrais suggérer que vous ne vérifiez pas au moment de l'exécution (ne sais pas si c'est une exigence ou non). Pour les choses en python que j'écris qui ont des dépendances externes (bibliothèques tierces), j'écris un script que les utilisateurs peuvent lancer pour vérifier leur installation python pour voir si les versions appropriées des modules sont installées.

Pour les modules qui ne possèdent pas d'attribut 'version' défini, vous pouvez inspecter les interfaces qu'il contient (classes et méthodes) et voir s'ils correspondent à l'interface qu'ils attendent. Ensuite, dans le code sur lequel vous travaillez, supposez que les modules tiers ont l'interface que vous attendez.

7

Quelques idées:

  1. Essayez de vérifier des fonctions qui existent ou qui ne figurent pas dans vos versions nécessaires.
  2. S'il n'y a pas de différence de fonction, inspectez les arguments de fonction et les signatures.
  3. Si vous ne parvenez pas à comprendre les signatures de fonctions, configurez des appels de remplacement lors de l'importation et vérifiez leur comportement.
213

Utilisez pkg_resources. Tout ce qui est installé à partir de PyPI au moins devrait avoir un numéro de version.

>>> import pkg_resources 
>>> pkg_resources.get_distribution("blogofile").version 
'0.7.1' 
+8

Notez également que le nom du package doit être celui de l'entrée PyPI. Donc, quelque chose comme "pkg_resources.get_distribution ('MySQLdb'). Version" ne fonctionnera pas "pkg_resources.get_distribution ('mysql-python'). Version" will. – Rahul

+1

Si vous utilisez un nom de fichier absolu, 'pkg_resources' pourrait choisir une version différente de celle que vous utilisez actuellement car elle a une priorité plus élevée sur votre' PYTHONPATH' ou similaire. – tripleee

+3

Si quelqu'un veut savoir comment créer l'attribut '__version__': http://stackoverflow.com/q/17583443/562769 –

2

Vous pouvez utiliser

pip freeze 

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