67 votes

Comment écrire un code Python capable de requérir correctement une version minimale de Python ?

J'aimerais voir s'il existe un moyen d'exiger une version minimale de python.

J'ai plusieurs modules python qui nécessitent Python 2.6 en raison de la nouvelle gestion des exceptions ( as mot-clé).

Il semble que même si je vérifie la version de python au début de mon script, le code ne s'exécutera pas car l'interpréteur échouera à l'intérieur du module, lançant une vilaine erreur système au lieu de dire à l'utilisateur d'utiliser un python plus récent.

0 votes

0 votes

La réponse vous accepté à stackoverflow.com/questions/3035749 n'utilise pas de nouveau traitement des exceptions.

1 votes

MISE À JOUR (29 octobre 2016) : Maintenant support de setuptools et pip python_requires mot-clé pour setup fonction - voir mon réponse .

41voto

Walter Mundt Points 9160

Vous ne devez pas utiliser de fonctionnalités de Python 2.6 à l'intérieur du script lui-même. De même, vous devez effectuer votre vérification de version avant d'importer l'un des modules nécessitant une nouvelle version de Python.

Par exemple, commencez votre script comme ceci :

#!/usr/bin/env python
import sys

if sys.version_info[0] != 2 or sys.version_info[1] < 6:
    print("This script requires Python version 2.6")
    sys.exit(1)

# rest of script, including real initial imports, here

2 votes

+1. J'ai ajouté des parenthèses à votre print parce que sinon, comme Tim l'a souligné, il aurait échoué avec une SyntaxError en Python 3 (une affaire délicate !) Je pense que c'est la manière la plus correcte de le faire - ma méthode est plus rapide mais c'est un peu un hack.

0 votes

Je ne pensais pas que cela serait nécessaire pour qu'il fonctionne dans Python 3. Après tout, Python 3 n'est, en général, pas compatible avec le code source de Python 2.x. Puisqu'il est nécessaire de distribuer des versions séparées de Python 2.x et 3.x pour à peu près tout, vous pouvez simplement ne pas vérifier la version Python 3.x du tout.

5 votes

Ce serait bien de se retirer gracieusement même en essayant d'exécuter le script avec 3.x mais cela ne fonctionnera pas si le tout le site script se trouve être_syntaxiquement_ valide 3.x. print n'est pas un bon choix pour l'impression du message d'erreur, car il s'imprime dans le fichier stdout par défaut ; la solution simple consiste à utiliser sys.exit("This script requires Python 2.x, >= 2.6" ) (comme dans la réponse acceptée), qui imprime à stderr et sort également avec le code 1. (Soit dit en passant, sous Windows, lorsque l'invocation se fait à l'aide de la commande pythonw.exe il faudrait faire un travail supplémentaire pour que l'erreur apparaisse).

17voto

Scott Griffiths Points 8867

La façon la plus simple que j'ai trouvée pour faire cela (voir ceci question aussi) est juste d'ajouter une ligne comme :

b'You need Python 2.6 or later.'

au début du fichier. Cela exploite le fait que les littéraux d'octets ont été introduits dans la version 2.6 et que les versions antérieures soulèveront un problème d'erreur. SyntaxError avec le message que vous écrivez donné comme trace de la pile.

Si vous avez besoin de Python 2.7, pourquoi pas :

{'You need Python 2.7 or later.'}

ce qui est une erreur de syntaxe en 2.6.

Pour Python 2.5, cela devrait fonctionner :

'You need Python 2.5' if 'you want this to run or' else 'this line fails!'

ce qui est une erreur de syntaxe dans la version 2.4.

11voto

sorin Points 23747
import sys
if sys.hexversion < 0x02060000:
    sys.exit("Python 2.6 or newer is required to run this program.")

import module_requiring_26

Ce qui est bien aussi, c'est qu'elle peut être incluse dans l'élément __init__ ou le module.

3 votes

Ne voudriez-vous pas vous protéger contre l'exécution du script sous Python 3 ?

3 votes

Il s'agit d'une version inférieure de la réponse de Walter Mundt qui a déjà été postée avant celle-ci.

2 votes

Moins intuitif et moins lisible que "sys.version_info < (2, 6)" de @Arkady.

1voto

lvc Points 12046

Je suppose que vous avez quelque chose comme :

import module_foo
...
import sys
# check sys.version

mais le module_foo nécessite aussi une version particulière ? Dans ce cas, il est tout à fait possible de réorganiser votre code ainsi :

import sys
# check sys.version
import module_foo

Python ne requiert pas que les importations, à l'exception de from __future__ import [something] être en haut de votre code.

1 votes

"Python n'exige pas que les imports [...] soient en haut de votre code". C'est vrai, mais PEP 8 dit : "Les imports sont toujours placés en haut du fichier, juste après les commentaires et les docstrings du module, et avant les globals et les constantes du module" ; donc la plupart des linters de code se plaindront si vous ne mettez pas les imports en haut. Néanmoins, AFAIK, c'est inévitable dans ce cas.

-3voto

Jakob Bowyer Points 12873

Plutôt que d'indexer, vous pouvez toujours faire ceci,

import platform
if platform.python_version() not in ('2.6.6'):
    raise RuntimeError('Not right version')

2 votes

Cela code en dur un spécifique alors que la question porte sur une version minimum vérification de la version.

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