Aller au contenu

Exécution d'un fichier python

Lorsqu'on lance un fichier Python, il se passe un certain nombre de choses plus ou moins complexes. Ici nous allons simplement insister sur la distinction entre "Python lit une définition de fonction" et "Python exécute une fonction" via quelques exemples.

Exemple 1

Prenons le code ci-dessous enregistré dans un fichier python, dans lequel les fonctions définies sont des fonctions qui se contentent d'afficher un résultat.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def f():
    print("Exécution de f")



def g():
    print("Exécution de g")


print("Exécution de la partie \"principale\" ")

On lance l'exécution de ce fichier. Quel affichage obtient-on ?

Ce que l'on obtient

On obtient:

Exécution de la partie "principale" 

En particulier, on n'obtient pas les messages Exécution de f ou Exécution de g alors que les print correspondants semblent être placés avant dans le texte.

Pourquoi?

Pourquoi n'obtient-on pas Exécution de f ou Exécution de g ?

Parce qu'on ne l'a pas demandé!

Il faut bien comprendre ce qu'il passe lorsqu'on demande d'exécuter le fichier. Un descriptif simplifié:

Ce fichier est lu dans l'ordre du texte.

  • Lorsque le code des lignes 1,2 est lu,

    1
    2
    def f():
        print("Exécution de f")
    
    c'est la définition de cette fonction qui est ainsi lue. Cette définition est stockée en mémoire, cette mémoire est étiquetée f. Mais le corps de la fonction n'est pas exécuté à ce moment là, l'action faite est uniquement d'enregistrer la définition de la fonction.

  • Il en va de même lorsque le code des lignes 6,7 est lu.

    6
    7
    def g():
        print("Exécution de g")
    

  • Puis on lit le code de la ligne 10

    10
    print("Exécution de la partie \"principale\" ")
    
    Ce code est en-dehors de la définition d'une fonction: il est donc, lui, exécuté.

Affichages de f et g

Pour obtenir les affichages de f et g, il faut faire un appel à ces fonctions.

Par exemple (lignes 11 et 12):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def f():
    print("Exécution de f")



def g():
    print("Exécution de g")


print("Exécution de la partie \"principale\" ")
g()
f()

Exemple 2

Un fichier python contient le code suivant:

print("Valeur de a: ", a)
a = 2

Qu'obtiendra-t-on à l'exécution de ce fichier ?

Solution

On obtient une erreur.

NameError: name 'a' is not defined
Pourquoi ?

Lorsque la ligne print("Valeur de a: ", a) est lue, cette ligne n'étant pas dans le corps de définition d'une fonction, elle est exécutée. Mais à ce moment là, la variable a n'a pas encore été définie. Il y a donc tentative d'affichage d'une valeur non définie.

Exemple 3

Code 1

Avec le code suivant:

1
2
3
4
5
6
7
def f():
    print("Valeur de a: ", a)



a=2
f()

l'instruction print("Valeur de a: ", a) semble également être écrite avant que l'on définisse a. Aura-t-on le même problème que dans l'exercice précédent ?

Solution

Non, on obtient:

Valeur de a:  2
Pourquoi?

Lorsque le fichier est lu:

  • la définition de f (lignes 1,2) est d'abord lue, mais rien n'est exécuté. On se contente de mettre l'étiquette f sur un ordre du type print...

  • Ensuite a=2 (ligne 6) est lu et exécuté. Il y a donc bien à ce stade une variable nommée a.

  • Enfin f est exécutée (appel de la ligne 7): l'intruction print ... est exécutée et à ce stade ne pose pas de problème car a est bien connu.

Code 2

Et avec le code suivant, qu'obtient-on ?

1
2
3
4
5
6
def f():
    print("Valeur de a: ", a)


f() 
a=2
Solution

A nouveau une erreur.

Pourquoi?

Lorsque le fichier est lu:

  • la définition de f (lignes 1,2) est d'abord lue, mais rien n'est exécuté. On se contente de mettre l'étiquette f sur un ordre du type print...

  • Ensuite, avec l'instruction f() (ligne 5), on exécute f... or à ce stade, la ligne définissant a n'a pas encore été lue. L'instruction print... que l'on cherche à exécuter va donc provoquer une erreur.

Exemple 4

Et avec le code suivant, quels affichages obtient-on ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def f():
    print("Exécution de f.")
    g()

def g():
    print("Exécution de g.")



f()
Solution

On obtient:

Exécution de f.
Exécution de g.
Pourquoi?

Il faut comprendre pourquoi il n'y a pas d'erreur alors que l'appel à la fonction g est écrit avant que g ne soit définie.

Là encore, il ne faut pas confondre la définition et l'exécution.

  • Python lit le texte définissant f (lignes 1 à 3):

    def f():
        print("Exécution de f.")
        g()
    
    A ce stage, le code n'est pas exécuté.

  • Puis Python lit le texte définissant g (lignes 5 à 6):

    def g():
        print("Exécution de g.")
    
    Il n'y a toujours pas d'exécution d'instruction à ce stade.

  • Enfin, Python lit le code lui demandant d'exécuter f (ligne 10) dans la "partie principale". A ce stade, il va donc bien chercher à exécuter g (instruction ligne 3 dans le code définissant f) ... mais à ce moment là, la définition de g a bien été déjà lue: il n'y a donc pas de problème.