Executer un fichier arbitraire et modifier les variables du script appelant

Wed 07 November 2012 | Damien Python

Le code si dessous permet de charger et d’exécuter un fichier python arbitraire qui va venir modifier des données dans les variables du script appelant :

#
# application.py
#

# Nous créons une classe afin de pouvoir passer une instance d'objet au script qui seras lancé.
class Test:

    def __init__(self):

        # On définit un attribut avec une valeur par défaut.
        # C'est cette valeur que nous allons éssayer de modifier.
        self.name = "Kitty"

# On créé une instance de la classe
test_variable = Test()

# On charge maintenant un fichier de manière totalement arbitraire.
# Ce pourait être un fichier de configuration utilisateur ou des jeux de données externes.
with open("fichier.py", 'r') as file:

    # Avec Python3 on doit utiliser exec afin de pouvoir passer des variables qui feront partis
    # du scope globale dans le fichier executé.
    # Doc. de exec : http://docs.python.org/3/library/functions.html#exec
    # Doc. de compile : http://docs.python.org/3/library/functions.html#compile
    exec(compile(file.read(), "fichier", "exec"), {"test": test_variable})

# On vérifie que les modifications faites dans fichier.py ont bien été repercutées jusqu'ici.
print("Hello %s" % test_variable.name)
#
# fichier.py
#

# On test le nom par défaut
print("Hello %s" % test.name)

# On modifie le nom de l'objet avant de quitter l'execution
test.name = "World"
# damien at clockwork in ~ [8:59:29]
$ python3 application.py
Hello Kitty
Hello World