Gérer plusieurs versions de Python avec “py” sous Windows 7


Il est courant de vouloir installer plusieurs versions de Python. Pour faire des tests, pour s’assurer que son code est portable, pour utiliser des libs qui marchent uniquement sur une des versions, etc.

Sous Linux, c’est facile : chaque interpretteur est préfixé. Par exemple, sous Ubuntu, si je veux utiliser Python 3.4, je l’installe :

sudo apt-get install python3.4

Et si je lance python, ça me lance la 2.7 car c’est celle de base. Mais si je lance python3.4, ça me lance bien la 3.4.

Au final, on finit par utiliser des environnements virtuels qui isolent des versions de Python particulières. Mais ça ne retire pas l’envie de pouvoir choisir sa version de Python au niveau du système, ce qui reste difficile à faire sous Windows.

Or, depuis la version 3.3, l’installeur pour cet OS de Python installe la commande py, qui permet de choisir quelle version de Python on lance.

Dans un terminal

Si dans une console vous faites :

py

Il lancera le shell de votre installation Python 2.x la plus récente.

Si vous faites :

py script.py

Il exécutera le script avec votre installation Python 2.x la plus récente.

Mais vous pouvez passez un flag -version pour forcer une version de Python. Lancer le shell Python avec la 3.3 :

py -3.3

Lancer un script avec la 3.4 :

py -3.4 script.py

Cela suppose que vous avez la 3.3 et la 3.4, installés, évidement.

La syntaxe est surprenante. J’aurais pensé qu’ils mettraient un truc du genre py -i 3.4 mais non, c’est direct -numero.

La commande py accepte aussi les paramètres qu’on passerait normalement à la commande python, et notament l’option -m module, qui permet de lancer un module en particulier.

C’est pratique pour lancer ipython ou pip avec une version particulière. Par exemple pour installer autobahn uniquement pour la version 3.4 et donc utiliser asyncio :

py -3.4 -m pip install autobahn

Bang !

La commande py reconnait également la ligne shebang, cette syntaxe unix qui dit quel interpretteur utiliser. Si vous mettez sur la première ligne de votre script :

#! python3.4

Alors :

py script.py

Invoquera python 3.4.

La commande est capable de se débrouiller avec les chemins Unix, afin de garder la portabilité. Donc si vous faites :

#! /usr/bin/env python2.7

Alors :

py script.py

Va ignorer le debut de la ligne, et prendre l’installation locale de Python 2.7 pour lancer le script.

On click

Si vous installez la version Python 3.3 ou 3.4 en premier, les fichiers .py seront associés à la commande py. Donc si vous cliquez sur un script Python avec une ligne shebang, la bonne version sera lancée.

Mais si vous avez installé Python 2.x avant, il est possible que vos fichiers .py soient encore associés directement à la commande python ordinnaire.

Pour changer cela, faites un clic droit sur un fichier .py, modifiez le programme qui ouvre ce fichier et faites le pointer sur "C:\Windows\py.exe".

7 thoughts on “Gérer plusieurs versions de Python avec “py” sous Windows

  • krypty

    Merci c’est très utile. J’utilisais une méthode de bucheron avec des liens symboliques qui ne permet de faire ce qui est proposé ici notamment la détection de shebang.

    J’adore ce blog. Il est unique ! Merci à vous !

    PS: Ça peut paraître con mais Sam et Max c’est bien deux personnes ? Parce que j’ai l’impression que seul Sam poste des articles et répond aux commentaires :-)

  • Sam Post author

    Ouai, mais Max est un braleur, ça fait des mois qu’il traine pour pondre des trucs. Il participe toujours, par exemple en installant indexerror, ou en me donnant des aventures à raconter, mais c’est vrai que sa prose manque.

  • Sam Post author

    C’est recommandé sur aucun OS, mais les gens le font.

    Il y a des cas particuliers où tu as besoin de ça aussi :

    • tu es sysadmin, et tu installes des programmes pur python sur tes machines. Tu vas pas demander à tes utilisateurs d’utiliser virtualenv, ils vont juste cliquer. Au pire lancer une commande pour les plus avancés.
    • tu es des et tu veux des outils comme grin et pyped, tu les installes au niveau système sinon à chaque fois que tu veux rentrer une commande, faut charger un env, tu peux pas les utiliser dans les autres env, etc.
  • Sabcat

    Arf… Moi j’utilise des alias dans mon .zshrc (alias p=”python” et alias p3=”python3″)

    Mais bon, j’en fais une utilisation perso, donc pas trop de test de versions. Par contre l’histoire du shebang, j’avais jamais fais le rapprochement. :)

  • Max

    ouais je suis un gros branleur j’avoue :)

    j’attends le bon moment pour sortir mon super article bien dégeux, faut du temps .

    Pour le reste comme dit sam je suis plutôt aux machines, j’installe, rafistole, etc

Leave a comment

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.