【发布时间】:2020-05-26 06:36:01
【问题描述】:
imp 模块已弃用(自 3.4 版起),但基础架构的某些部分(例如pyximport)仍使用imp.load_dynamic,这会导致较新的 Python 版本出现弃用警告。
在内部,imp.load_dynamic 使用 importlib-machinery:
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)
但是为所有类型的项目复制这段代码(at least once 必须改进)感觉很愚蠢。
importlib 的文档proposes 如下:
import importlib.util
import sys
def alternative_load_dynamic(name, path, file=None):
spec = importlib.util.spec_from_file_location(name, path)
module = importlib.util.module_from_spec(spec)
sys.modules[name] = module
spec.loader.exec_module(module)
return sys.modules[name]
虽然与第一个实现(即_load)相比,它具有不使用私有API 的优势,并且获得了issue #24748 的核心行为,但它不是imp.load_dynamic 的直接替代品:
- 这个替代方案可以更多:它还可以加载纯 Python 模块(
*.py或*.pyc)。 - 这种替代方法可以少:它只能加载以
*.so(或Windows 上的*.pyd)结尾的动态模块,但不能加载例如foo.my_ending。
还有哪些替代imp.load_dynamic的选项?
【问题讨论】:
标签: python python-3.x python-importlib