385 votes

Comment détecter la version de Python au moment de l'exécution ?

J'ai un fichier Python qui doit supporter les versions de Python < 3.x et >= 3.x. Existe-t-il un moyen d'introspecter le runtime Python pour connaître la version qu'il exécute (par exemple, 2.6 or 3.2.x ) ?

660voto

Chris Points 12438

Bien sûr, jetez un coup d'œil à sys.version y sys.version_info .

Par exemple, pour vérifier que vous utilisez Python 3.x, utilisez

import sys
if sys.version_info[0] < 3:
    raise Exception("Must be using Python 3")

Ici, sys.version_info[0] est le numéro de la version majeure. sys.version_info[1] vous donnerait le numéro de la version mineure.

Dans Python 2.7 et les versions ultérieures, les composants de sys.version_info est également accessible par son nom, de sorte que le numéro de version majeure est sys.version_info.major .

Voir aussi Comment puis-je vérifier la version de Python dans un programme qui utilise de nouvelles fonctionnalités du langage ?

122voto

Avinash Points 540

Essayez ce code, cela devrait fonctionner :

import platform
print(platform.python_version())

0 votes

Pour information, cela fonctionne, mais le python_version renvoie une chaîne de caractères (par exemple, sur mon système, elle imprime '3.6.1' ). Si vous vérifiez la version dans un if Dans le cas d'une déclaration comme celle de l'OP, la réponse de Chris est beaucoup plus logique, car vous n'avez pas à passer par le processus fastidieux de recherche de la chaîne de caractères pour obtenir l'information souhaitée. Cette réponse est la voie à suivre si vous voulez enregistrer ou afficher la version pour qu'elle soit lue par un humain.

0 votes

@NauticalMile La réponse de Chris renvoie également une chaîne de caractères, il indexe juste le premier caractère pour voir si c'est le cas. '3' ou non ; il en va de même ici.

0 votes

En quoi cela résout-il mieux le problème, voire pas du tout ? Utiliser sys.version_info[0] ou simplement sys.version[0] est déjà suffisant ...

27voto

Insidi0us Points 1040

Par sys.hexversion y Versionnement de l'API et de l'ABI :

import sys
if sys.hexversion >= 0x3000000:
    print('Python 3.x hexversion %s is in use.' % hex(sys.hexversion))

0 votes

Cela permet de tester à la fois les principales y dans un test unique, simple et facile à lire, je pense qu'il s'agit de la meilleure réponse.

27 votes

Vous pouvez également faire quelque chose comme if sys.version_info >= (3,6,0) car les tuples sont directement comparables.

2 votes

@adzenith , je pense que votre réponse est la plus rapide, la plus concise et la plus facile à comprendre. Vous devriez la publier en tant que réponse.

17voto

Michael Goldshteyn Points 24679

Au cas où vous voudriez voir tous les détails sanglants sous une forme humainement lisible, vous pouvez utiliser :

import platform;

print(platform.sys.version);

Sortie pour mon système :

3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) 
[GCC 7.2.0]

Une solution très détaillée, mais analysable par une machine, consisterait à obtenir le fichier version_info de l'objet platform.sys et d'utiliser ses propriétés pour adopter une ligne de conduite prédéterminée. En voici un exemple :

import platform;

print(platform.sys.version_info)

Sortie sur mon système :

sys.version_info(major=3, minor=6, micro=5, releaselevel='final', serial=0)

2 votes

Noter que platform.sys n'est que le sys Il est donc préférable de se contenter de l'option import sys; print(sys.version) . en fait, je ne vois pas sys comme documentée dans le platform paquet à tous

16voto

Benjamin Striner Points 149

La meilleure solution dépend de la quantité de code incompatible. S'il y en a beaucoup, vous devez supporter Python 2 et 3, six est le module de compatibilité. six.PY2 y six.PY3 sont deux booléens si vous voulez vérifier la version.

Cependant, une meilleure solution que l'utilisation d'un grand nombre de if est d'utiliser six les fonctions de compatibilité si possible. Hypothétiquement, si Python 3000 a une nouvelle syntaxe pour next quelqu'un pourrait mettre à jour six afin que votre ancien code fonctionne toujours.

import six

# OK
if six.PY2:
  x = it.next() # Python 2 syntax
else:
  x = next(it) # Python 3 syntax

# Better
x = six.next(it)

http://pythonhosted.org/six/

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