Модуль imp
устарел (начиная с версии 3.4), однако некоторые части инфраструктуры все еще используют imp.load_dynamic
. Как это лучше всего заменить?
Внутренне, imp.load_dynamic
использует importlib
-машины :
from importlib._bootstrap import _load,
def load_dynamic(name, path, file=None):
"""**DEPRECATED**
Load an extension module.
"""
import importlib.machinery
loader = importlib.machinery.ExtensionFileLoader(name, path)
# Issue #24748: Skip the sys.modules check in _load_module_shim;
# always load new extension
spec = importlib.machinery.ModuleSpec(
name=name, loader=loader, origin=path)
return _load(spec)
Но глупо дублировать этот код (который хотя бы один раз нужно было улучшить). Какие есть лучшие альтернативы?
В документации importlib предлагается
import importlib.util
import sys
# For illustrative purposes.
import tokenize
file_path = tokenize.__file__
module_name = tokenize.__name__
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)
, которая не более привлекательна, чем код из CPython - источник.