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"
.
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 :-)
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.
D’un autre coté, les install système de python ne sont pas vraiment recommandées sous windows.
C’est recommandé sur aucun OS, mais les gens le font.
Il y a des cas particuliers où tu as besoin de ça aussi :
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. :)
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
Si ça peut intéresser des gens, j’ai écris un équivalent pour Linux:
https://chezsoi.org/lucas/blog/2015/01/12/en-equivalent-for-linux-of-windows-python-launcher-py/