我使用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
库已经是deprecated,所以我想使用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
。知道如何正确执行吗?