Skip to content

TP1. Unix is love

Énoncé

Cet exercice a pour but de créer un premier programme python, et surtout de faire le lien avec le stage Unix.

Pour ce faire, vous devez effectuer les étapes suivantes :

  • ouvrir votre éditeur de texte favori pour créer un fichier le_nom_que_vous_voulez.py ;
  • écrire dans ce fichier un programme affichant ce qui vous passe par la tête sur la sortie standard ;
  • rendre le programme exécutable ;
  • l'exécuter dans un terminal.

Enfin, effectuez une redirection vers un fichier à l'aide de la commande suivante :

[selvama@ensipc215 unixislove]$ ./le_nom_que_vous_voulez.py > unixislove.log

Quel est l'effet de cette redirection ?

Difficulté

star

Correction

Cliquez ici pour révéler la correction de l'exercice.

Corrigé du fichier un_nom_qui_en_jette.py

#!/usr/bin/env python3

"""
Mon premier programme python.

La première ligne (ci-dessus) du fichier, communément appelée "shebang"
est utilisée pour indiquer au système quel programme utiliser pour exécuter
le fichier lorsque celui ci est utilisé comme un exécutable, par exemple
lorsque l'on tape "./un_nom_qui_en_jette.py" dans un terminal.
"""

# La fonction print affiche la chaîne de caractère passée
# en paramètre sur la sortie standard.
print("On n'est pas bien là ?")

Explications

Et oui, le stage Unix nous est déjà utile :)

Pour exécuter ce programme :

  1. Le fichier du programme doit être exécutable (chmod +x un_nom_qui_en_jette.py) ;
  2. On doit indiquer au système quel interpréteur utiliser pour interpréter son contenu.

C'est le rôle de la première ligne du fichier :

#! /usr/bin/env python3

Cette ligne, aussi appelée shebang, indique au système d'exploitation que ce fichier exécutable n'est pas un fichier binaire, mais un script sous forme d'un fichier texte. Par défaut, le système tentera de faire interpréter le contenu de ce script par l'interprète de commandes qui l'exécute. Autrement dit, sans cette ligne, le contenu du fichier un_nom_qui_en_jette.py serait interprété par le shell qui exécute la commande :

[selvama@ensipc215 unixislove]$ ./un_nom_qui_en_jette.py

Le contenu du fichier serait donc interprété comme étant un script shell, et plus un programme python, ce qui au mieux, ferait n'importe quoi, à peu près. Avec un shebang correct, l'exécution de ./un_nom_qui_en_jette.py devient équivalente à lancer depuis le terminal la commande /usr/bin/env python3 ./un_nom_qui_en_jette.py.

Bien que cela soit moins pratique, il est également possible de lancer un programme python en invoquant directement l'intrepréteur :

[selvama@ensipc215 unixislove]$ python3 un_nom_qui_en_jette.py

Dans ce cas, même pas besoin de positionner les droits en exécution sur le fichier un_nom_qui_en_jette.py.

Et /usr/bin/env, alors ?

Le shebang doit contenir le chemin absolu vers l'interpréteur à utiliser, par exemple en écrivant #! /usr/bin/python3. Mais comment faire pour exécuter notre script sur une machine où python3 a été installé à un emplacement différent, par exemple /opt/local/bin/python3 ?

Les plus perspicaces d'entre vous auront remarqué la présence de la commande /usr/bin/env devant notre interpréteur python préféré. Cette commande augmente la portabilité de notre script, en indiquant qu'on souhaite utiliser le programme python3, quel que soit son emplacement sur la machine.

Côté utilisateur, il faut que le chemin où est installé python3 se trouve dans PATH. Si ça ne vous dit rien, il est temps d'aller (re)lire un bout du stage Unix de rentrée : section 8.5.

Concernant la redirection avec le symbole >, on observe que le message n'est plus affiché sur le terminal. En effet, la redirection > unixislove.log remplace la sortie standard "terminal" par le fichier unixislove.log. Le message donné en argument de l'appel de fonction print est donc "imprimé" dans le fichier unixislove.log. Il suffit d'ouvrir ce fichier avec un éditeur de texte, celui que l'on préfère, pour s'en convaincre.