iBug
iBug

Reputation: 37227

importlib.reload module from string?

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.

Upvotes: 8

Views: 6571

Answers (2)

iBug
iBug

Reputation: 37227

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))

Upvotes: 5

spinkus
spinkus

Reputation: 8550

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)

Upvotes: 13

Related Questions