Comment vérifier quelle version de l'interpréteur Python interprète mon script?
Cette information est disponible dans la chaîne sys.version du module sys :
>>> import sys
Lisible par l'homme:
>>> print(sys.version) # parentheses necessary in python 3.
2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)]
Pour un traitement ultérieur:
>>> sys.version_info
(2, 5, 2, 'final', 0)
# or
>>> sys.hexversion
34014192
Pour vous assurer qu'un script est exécuté avec une version minimale de l'interpréteur Python, ajoutez ceci à votre code:
assert sys.version_info >= (2, 5)
Ceci compare les informations de version majeure et mineure. Ajoutez un micro (= 0
, 1
, etc.) et même un releaselevel (= 'alpha'
, 'final'
, etc.) au tuple à votre guise. Notez cependant qu'il est presque toujours préférable de "détourner" de vérifier si une certaine fonctionnalité est là, et sinon, contournement (ou renflouement). Parfois, les fonctionnalités disparaissent dans les nouvelles versions, remplacées par d'autres.
A partir de la ligne de commande (notez la majuscule 'V'):
python -V
Ceci est documenté dans 'man python'.
J'aime sys.hexversion
pour des choses comme ça.
http://docs.python.org/library/sys.html#sys.hexversion
>>> import sys
>>> sys.hexversion
33883376
>>> '%x' % sys.hexversion
'20504f0'
>>> sys.hexversion < 0x02060000
True
Votre meilleur pari est probablement quelque chose comme ceci:
>>> import sys
>>> sys.version_info
(2, 6, 4, 'final', 0)
>>> if not sys.version_info[:2] == (2, 6):
... print "Error, I need python 2.6"
... else:
... from my_module import twoPointSixCode
>>>
En outre, vous pouvez toujours encapsuler vos importations en un simple essai, ce qui devrait permettre de détecter les erreurs de syntaxe. Et, au point de @ Heikki, ce code sera compatible avec des versions beaucoup plus anciennes de python:
>>> try:
... from my_module import twoPointSixCode
... except Exception:
... print "can't import, probably because your python is too old!"
>>>
Utilisez platform
'S python_version
depuis stdlib:
>>> from platform import python_version
>>> print(python_version())
2.7.8
Mettez quelque chose comme:
#!/usr/bin/env/python
import sys
if sys.version_info<(2,6,0):
sys.stderr.write("You need python 2.6 or later to run this script\n")
exit(1)
en haut de votre script.
Notez qu'en fonction de ce qui se trouve dans votre script, les versions plus anciennes de python que la cible peuvent même ne pas pouvoir charger le script. Par conséquent, vous n'irez pas assez loin pour signaler cette erreur. Pour contourner le problème, vous pouvez exécuter ce qui précède dans un script qui importe le script avec le code plus moderne.
Voici une version courte de la ligne de commande qui se termine immédiatement (pratique pour les scripts et l'exécution automatisée):
python -c "print(__import__('sys').version)"
Ou juste le majeur, mineur et micro:
python -c "print(__import__('sys').version_info[:1])" # (2,)
python -c "print(__import__('sys').version_info[:2])" # (2, 7)
python -c "print(__import__('sys').version_info[:3])" # (2, 7, 6)
Avec le module six
, vous pouvez le faire en:
import six
if six.PY2:
# this is python2.x
else:
# six.PY3
# this is python3.x
Il suffit de taper python dans votre terminal et vous pouvez voir la version comme suit
desktop:~$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Comme Seth l'a dit, le script principal pourrait vérifier sys.version_info
(mais notez qu'il n'apparaissait pas avant la version 2.0, donc si vous souhaitez prendre en charge les versions plus anciennes, vous devez vérifier une autre propriété de version du module sys).
Cependant, vous devez toujours vous assurer de ne pas utiliser dans le fichier les fonctionnalités du langage Python qui ne sont pas disponibles dans les anciennes versions de Python. Par exemple, cela est autorisé dans Python 2.5 et versions ultérieures:
try:
pass
except:
pass
finally:
pass
mais ne fonctionnera pas dans les anciennes versions de Python, car vous ne pourriez avoir que, sauf que OR enfin correspondre à la tentative. Donc, pour la compatibilité avec les anciennes versions de Python, vous devez écrire:
try:
try:
pass
except:
pass
finally:
pass
import sys
sys.version.split(' ')[0]
sys.version vous donne ce que vous voulez, il suffit de choisir le premier numéro :)
Vérifier la version Python: python -V
ou python --version
ou apt-cache policy python
vous pouvez également exécuter whereis python
pour voir combien de versions sont installées.
Pour voir un script MSDOS pour vérifier la version avant d'exécuter l'interpréteur Python (pour éviter les exceptions de syntaxe de version Python) Voir la solution:
et
Script MS; Vérification préalable de la version Python du module Python http://Pastebin.com/aAuJ91FQ (Script susceptible d'être facilement converti en un autre script de système d'exploitation.)
Plusieurs réponses suggèrent déjà comment interroger la version actuelle de Python. Pour vérifier par programme les exigences de version, je voudrais utiliser l'une des deux méthodes suivantes:
# Method 1: (see krawyoti's answer)
import sys
assert(sys.version_info >= (2,6))
# Method 2:
import platform
from distutils.version import StrictVersion
assert(StrictVersion(platform.python_version()) >= "2.6")
Juste pour le plaisir, voici une façon de le faire sur CPython 1.0-3.7b2, Pypy, Jython et Micropython. C'est plus une curiosité qu'une façon de le faire dans le code moderne. Je l'ai écrit dans http://stromberg.dnsalias.org/~strombrg/pythons/ , qui est un script permettant de tester un extrait de code sur plusieurs versions de python à la fois, de sorte que vous pouvez facilement obtenir un Découvrez quelles fonctionnalités de python sont compatibles avec quelles versions de python:
via_platform = 0
check_sys = 0
via_sys_version_info = 0
via_sys_version = 0
test_sys = 0
try:
import platform
except (ImportError, NameError):
# We have no platform module - try to get the info via the sys module
check_sys = 1
if not check_sys:
if hasattr(platform, "python_version"):
via_platform = 1
else:
check_sys = 1
if check_sys:
try:
import sys
test_sys = 1
except (ImportError, NameError):
# just let via_sys_version_info and via_sys_version remain False - we have no sys module
pass
if test_sys:
if hasattr(sys, "version_info"):
via_sys_version_info = 1
Elif hasattr(sys, "version"):
via_sys_version = 1
else:
# just let via_sys remain False
pass
if via_platform:
# This gives pretty good info, but is not available in older interpreters. Also, micropython has a
# platform module that does not really contain anything.
print(platform.python_version())
Elif via_sys_version_info:
# This is compatible with some older interpreters, but does not give quite as much info.
print("%s.%s.%s" % sys.version_info[:3])
Elif via_sys_version:
import string
# This is compatible with some older interpreters, but does not give quite as much info.
verbose_version = sys.version
version_list = string.split(verbose_version)
print(version_list[0])
else:
print("unknown")
sys.version_info
ne semble pas renvoyer une Tuple
à partir de 3.7. Au contraire, il retourne une classe spéciale, de sorte que tous les exemples utilisant des n-uplets ne fonctionnent pas, du moins pour moi. Voici le résultat d'une console Python:
>>> import sys
>>> type(sys.version_info)
<class 'sys.version_info'>
J'ai constaté que l'utilisation d'une combinaison de sys.version_info.major
et sys.version_info.minor
semble suffire. Par exemple,...
import sys
if sys.version_info.major > 3:
print('Upgrade to Python 3')
exit(1)
vérifie si vous utilisez Python 3. Vous pouvez même rechercher des versions plus spécifiques avec ...
import sys
ver = sys.version_info
if ver.major > 2:
if ver.major == 3 and ver.minor <= 4:
print('Upgrade to Python 3.5')
exit(1)
pouvez vérifier si vous utilisez au moins Python 3.5.
Pour vérifier la version Python des commandes sous Windows, exécutez les commandes suivantes dans une invite de commande et vérifiez le résultat.
c:\>python -V
Python 2.7.16
c:\>py -2 -V
Python 2.7.16
c:\>py -3 -V
Python 3.7.3
De plus, pour voir la configuration du dossier pour chaque version de Python, exécutez les commandes suivantes:
For Python 2,'py -2 -m site'
For Python 3,'py -3 -m site'
... vous pouvez (ab) utiliser les modifications de la portée de la compréhension de liste et le faire dans une expression single:
is_python_3_or_above = (lambda x: [x for x in [False]] and None or x)(True)