python crée un systeme de module/extension

a marqué ce sujet comme résolu.

Bonjour, j’ai un logiciel dans le quelle je voudrais donner la possibilité a des développeurs de créer des extension. je n’ai jamais fais cela et donc je vous demande des conseilles pour avoir un truc propre et cohérent. Voila ce que je pense faire :

1) crée une classe "kernel" qui contiendrais des fonctions pour manipuler mon logiciel depuis l’extérieure

2)Un dossier "extensions", qui contiendrais des fichiers .py et que mon programme devra exécuter.

3)Dans ces fichiers .py, mon logiciel appellera une fonction par exemple la fonction Run(). Cette fonction run contiendra le code qui modifie le comportement de mon logiciel. La fonction run utilisera des fonctions de la classe kernel pour modifier le comportement de mon logiciel

qu’en pensez vous, es ce une bonne stratégie ? Auriez vous un tuto/exemple qui présenterais un truc similaire à ce que je demande ?

+0 -0

Salut,

Pour répondre de façon courte, tout dépend de ce que fait ton soft et comment il fonctionne à l’origine, mais tu as effectivement mis le doigt sur les deux éléments les plus importants.

  1. Il faut que ton programme sache retrouver ses extensions au runtime.
  2. Il faut définir un moyen d’exécuter le code des extensions au bon moment.

Pour le 1., en python il suffit d’importer des modules dynamiquement avec le module standard importlib. Tu parles d’un dossier spécial où se mettent les extensions, c’est un bon moyen d’y parvenir. On peut aussi imaginer que les extensions se trouvent dans le PYTHON_PATH, et que le programme lit une conf qui liste le nom des modules à charger… La méthode que tu décris a le mérite d’être simple.

Pour le 2. ça dépend totalement de ton code. Tu peux imaginer imposer aux extensions de définir une fonction load() qu’il sera exécutée au chargement de l’extension, ou encore utiliser un dispatcher pour faire ça de façon sexy avec des décorateurs automatiquement quand le module est chargé…

Edit: corrigé, merci entwanne.

+1 -0

ou encore utiliser un dispatcher

nohar

Petite correction, pour l’URL publique de ton tutoriel, c’est par ici : https://zestedesavoir.com/tutoriels/1226/le-pattern-dispatcher-en-python/

Sinon, pour ce qui est de l’interface des modules/plugins à charger, tu peux t’inspirer de WSGI : les modules ont juste à contenir un objet d’un certain nom, qui doit posséder une interface précise (dans le cas précis de WSGI, l’objet doit être appelable, prendre deux paramètres, renvoyer un générateur, etc.).

merci pour vos réponses. Je pense utiliser un dispatcher. WSGI m’a l’air plus compliquer et plus adapter à une architecture client-serveur (il n’y a rien de tels dans mon programme)

Par contre je ne vois pas comment je fais pour charger mes fichiers .py. Je sais les lister y’a pas de soucis

1
2
3
4
import glob, os
os.chdir("./extensions")
for file in glob.glob("*.py"):
    print(file)

mais ensuite comment je les "charges" ? comment je lance les fonctions load de tous ces fichiers par exemple

+0 -0

j’ai pas compris ce que cela importe, importlib.import_module(monfichier)

Il importe mon fichier mais comment il vas faire la différence en 2 fonctions load() de 2 "modules" différents ? je vois pas ce que représente ces "modules", c’est des objets python ? ou bien cela peut etre uniquement une fonction toute simple ? ou encore autre chose… un module ou il faut crée un init.py.

Oui, un module est un objet Python. Si tu as importé ton module avec mod = import_module(...), tu peux accéder à sa fonction load à l’aide de mod.load.

Si tu as plusieurs modules, ils seront dans un conteneur, et tu pourras accéder successivement aux fonctions load des différents modules en itérant sur ton conteneur.

En même temps tu as dit plus haut que tu allais utiliser un dispatcher. Si c’est le cas tu n’as rien besoin d’exécuter explicitement au chargement du module. Avec un dispatcher le simple fait de charger le module enregistre les bonnes fonctions/classes aux bons endroits.

Pour que ce soit bien clair, en python un module n’est rien d’autre qu’un fichier .py. Ce dont tu parles avec le __init__.py c’est d’un package.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte