Système de plugins simple avec Python

Thu 09 January 2014 | Damien Python

Je cherche depuis quelques jours comment réaliser un système de plugins qui soit simple pour un projet.

Jusqu’alors, les plugins sont de simples fichiers python qui sont chargé et exécutés par le code principale. Une instruction en fin de fichier permet d’enregistrer le plugin pour qu’il soit utilisable de manière extrèmement simple :

# Code de chargement des plugins:

def load_plugins(self):

    # On parcours tous les fichiers disponibles dans le dossier de plugins.
    for file in os.listdir(self.plugins_folder):

        try:
            # On charge chaque fichier en lecture
            with open(os.path.join(self.plugins_folder, file), 'r') as file:
                # Et on l'execute en lui passant en paramètres l'instance d'Igor ansi que la classe IgorPlugin
                # pour permettre l'héritage.
                exec(compile(file.read(), "script", "exec"), {"igor": self, "IgorPlugin": IgorPlugin})
        except Exception as error:
            # En cas de problème, on affiche l'erreur
            sys.exit(error)

Ce type de chargement est prtaique mais avait un soucis pour moi : Impossible de charger des plugins avec plusieurs fichiers (ce qui n’est pas tout à fait vrai dans l’absolue).

J’ai donc cherché comment charger des modules complets en tant que plugins… en vain…

J’ai eu beau chercher de l’aide sur Stackoverflow on revient au même procédé car contrairement à d’autres langages, les variables même globales ne sont globales qu’au sein d’un module et non partagé lors de l’execution du script.

Je continue donc le développempent du projet avec des plugins en un seul fichier, mais je continue à réflechir sur une version améliorée des plugins.