251 votes

Python: le Meilleur moyen de vérifier la version de Python dans un programme qui utilise les nouvelles fonctionnalités de la langue?

Si j'ai un script Python qui nécessite au moins un particulier la version de Python, quelle est la bonne façon d'échouer gracieusement lorsqu'une version antérieure de Python est utilisé pour lancer le script?

Comment puis-je obtenir de contrôle assez tôt pour émettre un message d'erreur et la sortie?

Par exemple, j'ai un programme qui utilise le ternery opérateur (nouveau dans la version 2.5) et "par" blocs (2.6). J'ai écrit un simple petit interprète-version le vérificateur de routine qui est la première chose que le script serait appel ... sauf qu'il n'est pas loin. Au lieu de cela, l' script échoue au cours de python compilation, avant mes routines sont même appelés. Ainsi, l'utilisateur du script voit certains très obscur synax erreur de retraçage - qui assez bien besoin un expert pour en déduire que c'est tout simplement le cas de l'exécution de la mauvaise version de Python.

Je sais comment faire pour vérifier la version de Python. Le problème est que certains de la syntaxe est illégal dans les anciennes versions de Python. Considérons ce programme:

import sys
if sys.version_info < (2, 4):
    raise "must use python 2.5 or greater"
else:
    # syntax error in 2.4, ok in 2.5
    x = 1 if True else 2
    print x

Lors de l'exécution sous 2.4, je veux ce résultat

$ ~/bin/python2.4 tern.py 
must use python 2.5 or greater

et pas ce résultat:

$ ~/bin/python2.4 tern.py 
  File "tern.py", line 5
    x = 1 if True else 2
           ^
SyntaxError: invalid syntax

(Canalisation pour un collègue.)

118voto

orip Points 28225

Vous pouvez tester à l'aide de eval:

try:
  eval("1 if True else 2")
except SyntaxError:
  # doesn't have ternary

Aussi, with est disponible dans Python 2.5, il suffit d'ajouter from __future__ import with_statement .

EDIT: pour obtenir le contrôle assez tôt, vous pouvez le diviser différents .py fichiers et vérifier la compatibilité dans les principaux fichier avant de l'importer (par exemple, en __init__.py dans un package):

# __init__.py

# Check compatibility
try:
  eval("1 if True else 2")
except SyntaxError:
  raise ImportError("requires ternary support")

# import from another module
from impl import *

109voto

Ed Carrel Points 1823

Un wrapper autour de votre programme qui effectue les opérations suivantes.

import sys

req_version = (2,5)
cur_version = sys.version_info

if cur_version >= req_version:
   import myApp
   myApp.run()
else:
   print "Your Python interpreter is too old. Please consider upgrading."

Vous pouvez également envisager d'utiliser des sys.version(), si vous prévoyez de rencontrer des personnes qui sont à l'aide de pré-2.0 interpréteurs Python, mais vous avez un peu d'expressions régulières pour faire.

Et il y a peut-être plus élégante des façons de le faire.

34voto

James Anderson Points 18253

Essayez

l'importation de la plateforme
la plate-forme.python_version()

Devrait vous donner une chaîne comme "2.3.1". Si ce n'est pas exactement quel vous voulez il ya une richesse de l'ensemble des données disponibles par le biais de la "plate-forme" construire-dans. Ce que vous voulez doit être là quelque part.

22voto

sorin Points 23747

Probablement la meilleure façon de faire cette comparaison de version est à utiliser l' sys.hexversion. Ceci est important parce que la comparaison de la version n-uplets ne vous donnera pas le résultat souhaité dans toutes les versions de python.

import sys
if sys.hexversion < 0x02060000:
    print "yep!"
else:
    print "oops!"

8voto

André Points 4833

Jeux de est devenu partie du langage de base en Python 2.4, afin de rester compatible. Je l'ai fait à l'époque, qui va travailler pour vous aussi:

if sys.version_info < (2, 4):
    from sets import Set as set

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X