8
votes

Python: Importer chaque module d'un dossier?

Quelle serait la meilleure solution (lecture: la plus propre) de dire à Python d'importer tous les modules de certains dossiers?

Je veux permettre aux gens de mettre leurs "mods" (modules) dans un dossier de mon application que mon code doit vérifier à chaque démarrage et importer n'importe quel module mis là-bas.

Je ne veux pas non plus d'une étendue supplémentaire ajoutée à la substance importée (pas "myfolder.mymodule.Quelque chose", mais "quelque chose")


2 commentaires

Dupliqué possible de Chargement de tous les modules dans un dossier de Python


Vérifiez un thread similaire et sa réponse ici: Stackoverflow.com/Questtions/279237/...


3 Réponses :


1
votes

Créer un fichier nommé xxx pré>

dans le dossier et importer le nom du dossier comme celui-ci: p>

>>> from <folder_name> import * #Try to avoid importing everything when you can
>>> from <folder_name> import module1,module2,module3 #And so on


1 commentaires

Eh bien, comme suggéré dans la réponse liée ajoutez le dossier dans la liste OS.Path et importer ce dont vous avez besoin.



6
votes

Si transformer le dossier lui-même dans un module, à travers l'utilisation d'un __ init __. py code> fichier et en utilisant à partir de import * code> vous convient, vous pouvez itérer sur Le contenu du dossier avec "os.listdir" ou "glob.glob" et importer chaque fichier se terminant dans ".PY" avec le __ importer __ code> Fonction intégrée:

import os
for name in os.listdir("plugins"):
    if name.endswith(".py"):
          #strip the extension
         module = name[:-3]
         # set the module name in the current global name space:
         globals()[module] = __import__(os.path.join("plugins", name)


2 commentaires

Cela fonctionne toujours dans Python3.6, mais la dernière ligne est modifiée en: Import ImportLib; ImportLib.import_module ("Plugins" + "." + module)


Merci - ils ont amorcé l'utilisation de noms de fichiers dans __ importer __ . Le Funcion fonctionne toujours également, il suffit d'utiliser "". là au lieu de os.path.join