importlib.reload module from string?

Viewed 5261

I want to use importlib to reload a module whose name is dynamically generated.

Example:

import sys

def some_func():
    return "sys"

want_reload = some_func()

Now how do I reload the module sys using the variable want_reload? I can't supply it directly to importlib.reload() because it says it expects a module, not str.

It would be better if an invalid string, or a module that's not loaded, is supplied, e.g. "........", that it raises an exception.

2 Answers

importlib.import_module() won't reload, but returns a ref to the module even if already loaded:

import sys
import importlib

def some_func():
    return "sys"

want_reload = some_func()
want_reload_module = importlib.import_module(want_reload)
importlib.reload(want_reload_module)

Hinted by @spinkus's answer, I came up with this solution:

Since I don't want to load a module if it's not loaded already, I can fetch the ref from sys.modules

want_reload = some_func()
try:
    want_reload_module = sys.modules[want_reload]
    importlib.reload(want_reload_module)
except KeyError:
    raise ImportError("Module {} not loaded. Can't reload".format(want_reload))
Related