Dynamic loading of python modules Dynamic loading of python modules python python

Dynamic loading of python modules


Your code is almost correct.

See __import__ function.

def doSomething(name):    name = "package." + name    mod = __import__(name, fromlist=[''])    mod.doSomething()


Bastien already answered the question, anyway you may find useful this function I use to load all the modules from a subfolder in a dictionary:

def loadModules():    res = {}    import os    # check subfolders    lst = os.listdir("services")    dir = []    for d in lst:        s = os.path.abspath("services") + os.sep + d        if os.path.isdir(s) and os.path.exists(s + os.sep + "__init__.py"):            dir.append(d)    # load the modules    for d in dir:        res[d] = __import__("services." + d, fromlist = ["*"])    return res

This other one is to instantiate an object by a class defined in one of the modules loaded by the first function:

def getClassByName(module, className):    if not module:        if className.startswith("services."):            className = className.split("services.")[1]        l = className.split(".")        m = __services__[l[0]]        return getClassByName(m, ".".join(l[1:]))    elif "." in className:        l = className.split(".")        m = getattr(module, l[0])        return getClassByName(m, ".".join(l[1:]))    else:        return getattr(module, className)

A simple way to use those functions is this:

mods = loadModules()cls = getClassByName(mods["MyModule"], "submodule.filepy.Class")obj = cls()

Obviously you can replace all the "services" subfolder references with parameters.


import importlibmodule = importlib.import_module('my_package.my_module')my_class = getattr(module, 'MyClass')my_instance = my_class()