Quelle serait la meilleure solution (lecture: la plus propre) de dire à Python d'importer tous les modules de certains dossiers? P>
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. P>
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") p>
3 Réponses :
Créer un fichier nommé 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
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.
Si transformer le dossier lui-même dans un module, à travers l'utilisation d'un __ init __. py code> fichier et en utilisant
à partir de
__ 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)
Cela fonctionne toujours dans Python3.6, mais la dernière ligne est modifiée en: Import ImportLib; ImportLib.import_module ("Plugins" + "." + module) code>
Merci - ils ont amorcé l'utilisation de noms de fichiers dans __ importer __ code>. Le Funcion fonctionne toujours également, il suffit d'utiliser "". là au lieu de
os.path.join code>
Vous voudrez peut-être essayer ce projet: https://gitlab.com/aulien-lourot/importdir < / a> Avec ce module, il vous suffit d'écrire deux lignes pour importer tous les plug-ins dans votre répertoire et vous n'avez pas besoin d'un extra init __. py code> (ou tout autre autre fichier supplémentaire) : p>
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/...