Comment lire toutes les classes contenues dans * .py dans le répertoire spécifié par Python

C'est une méthode de stockage de Plugin, etc. dans un certain répertoire et d'import de tous les fichiers * .py dans ce répertoire sans spécifier de fichiers individuels dans le code.

Supposons la structure de répertoires suivante.

./loader.py
./plugins
./plugins/__init__.py
./plugins/a.py
./plugins/b.py

__init __. py est vide et OK. ʻA.pyetb.py` sont comme ça pour le moment.

a.py


#!/usr/bin/env python
# coding: utf-8

class Plugin1:
    ''' plugin1 '''

class Plugin2:
    ''' plugin2 '''

b.py


#!/usr/bin/env python
# coding: utf-8

class Plugin3:
    ''' plugin3 '''

Écrivez loader.py comme suit.

loader.py


#!/usr/bin/env python
# coding: utf-8

import os
import inspect
import importlib
import glob

def load_classes(dname):
    class_list = []

    # *.Charger py
    for fpath in glob.glob(os.path.join(dname, '*.py')):
        #Supprimer le séparateur d'extension et de chemin de fichier(Pour Unix'/')À'.'Remplacer par
        cpath = os.path.splitext(fpath)[0].replace(os.path.sep, '.')
        #Charger en tant que module
        mod = importlib.import_module(cpath)
        #Appelez la classe contenue dans le module chargé
        for cls_name, cls in inspect.getmembers(mod, inspect.isclass):
            # (Nom de classe avec chemin du répertoire,Corps de classe)Stocké au format
            class_list.append(('{0}.{1}'.format(cpath, cls_name), cls))

    return class_list
        

import pprint
clist = load_classes('plugins')
pprint.pprint(clist)

Le résultat de l'exécution est le suivant.

$ ./loader.py
[('plugins.a.Plugin1', <class plugins.a.Plugin1 at 0x10d2538d8>),
 ('plugins.a.Plugin2', <class plugins.a.Plugin2 at 0x10d253940>),
 ('plugins.b.Plugin3', <class plugins.b.Plugin3 at 0x10d2539a8>)]

Le deuxième élément de la liste est le corps de la classe, que vous pouvez utiliser pour créer une instance.

c = clist[0][1]()
print c
# <plugins.a.Plugin1 instance at 0x107195d40>

Recommended Posts

Comment lire toutes les classes contenues dans * .py dans le répertoire spécifié par Python
Comment connaître le répertoire actuel en Python dans Blender
Comment changer le fichier de configuration pour qu'il soit lu par Python
Comment utiliser l'astérisque (*) en Python. C'est peut-être tout? ..
Lisez le fichier ligne par ligne avec Python
Lisez le fichier ligne par ligne avec Python
[Python] Lire la ligne spécifiée dans le fichier
Comment trier en spécifiant une colonne dans le tableau Python Numpy.
Comment utiliser la bibliothèque C en Python
Comment effacer les caractères générés par Python
Comment obtenir les fichiers dans le dossier [Python]
Comment lire des fichiers dans différents répertoires
Comment obtenir une liste de fichiers dans le même répertoire avec python
Comment obtenir le nom de la variable lui-même en python
Comment obtenir le nombre de chiffres en Python
[Réintroduction à python] Comment importer via le répertoire parent
Lisez le fichier xml en vous référant au didacticiel Python
Comment utiliser le modèle appris dans Lobe en Python
[Python] Comment afficher les valeurs de liste dans l'ordre
Comment lire un csv contenant uniquement des entiers en Python
Comment lister les fichiers dans le répertoire spécifié (plusieurs conditions / recherche de sous-répertoire)
Comment développer en Python
[python] Comment vérifier si la clé existe dans le dictionnaire
[Python] Ouvrez le fichier csv dans le dossier spécifié par pandas
Comment déboguer une bibliothèque Python standard dans Visual Studio
Comment utiliser la méthode __call__ dans la classe Python
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Comment obtenir toutes les clés et valeurs du dictionnaire
Comment lire du texte avec une entrée standard ou une spécification de nom de fichier comme cat en Python
Python> bibliothèque> os> os.walk ()> Obtenir la structure du répertoire / l'implémentation pour obtenir chaque chemin de fichier dans le répertoire spécifié
Comment vérifier si le contenu du dictionnaire est le même en Python par valeur de hachage
Comment utiliser les classes dans Theano
Comment collecter des images en Python
Comment utiliser SQLite en Python
Dans la commande python, python pointe vers python3.8
Comment lire l'ensemble de données SNLI
Comment obtenir la version Python
Comment utiliser Mysql avec python
Comment envelopper C en Python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Comment gérer le japonais avec Python
Comment déterminer l'existence d'un élément sélénium en Python
Comment obtenir toutes les valeurs possibles dans une expression régulière
Le 15e comment écrire un problème de référence en temps réel hors ligne en Python
17e comment résoudre les problèmes d'écriture en temps réel hors ligne avec Python
Comment vérifier la taille de la mémoire d'une variable en Python
Comment déterminer qu'une clé croisée a été entrée dans Python3
Lire la sortie standard d'un sous-processus ligne par ligne en Python
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Le 14ème problème de référence d'écriture en temps réel hors ligne en python
Comment supprimer plusieurs positions (index) spécifiées dans une liste Python
[Note du débutant] Comment spécifier le chemin de lecture de la bibliothèque en Python
Le 18ème comment écrire un problème de référence en temps réel hors ligne en Python
Comment afficher les octets de la même manière en Java et Python
[Python Kivy] Comment obtenir le chemin du fichier par glisser-déposer
[Introduction à Python] Comment utiliser la classe en Python?
17ème problème de référence d'écriture en temps réel hors ligne implémenté en Python
Comment lire pydoc sur l'interpréteur python