web-dev-qa-db-fra.com

Comment vérifier quelle version de Python exécute mon script?

Comment vérifier quelle version de l'interpréteur Python interprète mon script?

954
carrier

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.

1155
krawyoti

A partir de la ligne de commande (notez la majuscule 'V'):

python -V

Ceci est documenté dans 'man python'.

305
jcolino

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
93
brianz

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!"
>>>
62
Seth

Utilisez platform 'S python_version depuis stdlib:

>>> from platform import python_version
>>> print(python_version())
2.7.8
49
Bill

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.

46
rjmunro

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)
21
Wolph

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
6
Dzhuang

Le plus simple

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.
>>> 
6
cjahangir

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
5
Heikki Toivonen
import sys
sys.version.split(' ')[0]

sys.version vous donne ce que vous voulez, il suffit de choisir le premier numéro :)

4
fengshaun

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.

3
Shusen Yi

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:

Comment puis-je vérifier la version de Python dans un programme utilisant de nouvelles fonctionnalités de langage?

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

2
DevPlayer

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")
2
normanius

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")
1
dstromberg

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.

1
Parker E.

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'
0
Aamir M Meman

Si vous voulez détecter une version antérieure à Python 3 et que vous ne voulez rien importer ...

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