Я (упростил) этот фрагмент кода с использованием библиотеки imp
:
fp, pathname, description = imp.find_module(site_init_modname, [site_dir])
m = sys.modules['SCons.Script']
sfx = description[0]
modname = os.path.basename(pathname)[:-len(sfx)]
site_m = {"__file__": pathname,
"__name__": modname,
"__doc__": None}
re_special = re.compile("__[^_]+__")
for k in list(m.__dict__.keys()):
if not re_special.match(k):
site_m[k] = m.__dict__[k]
exec(compile(fp.read(), fp.name, 'exec'), site_m)
Поскольку библиотека imp
устарела устарела , я хотел бы переписать этот фрагменткод с использованием importlib
.Я попробовал что-то вроде этого:
spec = importlib.util.spec_from_file_location(site_init_modname, site_init_file)
m = sys.modules['SCons.Script']
mod = importlib.util.module_from_spec(spec)
mod.loader.exec_module(mod)
Но это, очевидно, неправильно, потому что exec_module
должно быть сделано в пространстве имен SCons.Script
.Есть идеи как правильно это сделать?