加载期间自行更换的Python模块

时间:2019-04-18 11:19:12

标签: python-3.x python-import

最近我遇到了一些使用使我颇为紧张的把戏的代码。我正在查看的系统在路径外部存储了一个Python扩展Moo.so文件,开发人员希望仅使用import Moo导入它。由于各种原因,文件位置和sys.path都无法更改,并且扩展名必须始终以ExtensionFileLoader加载。

所以要做的是在加载扩展模块的路径中有一个Moo.py,然后按照以下几行用扩展模块替换sys.modules中的自身:

' Moo.py '

from importlib.machinery import ExtensionFileLoader

loader = ExtensionFileLoader('AnotherNameForMoo', '/path/to/Moo.so')
module = loader.load_module()
sys.modules['Moo'] = module

现在这确实有效。 (如果您想看一下,我会在this repo中对其进行一些相当详细的测试。)看来,至少在CPython 3.4至3.7中,import Moo并未绑定到{{1 }}加载并放入Moo的模块,但是在返回模块顶层脚本后,绑定{em> sys.modules['Moo']的当前值,无论是否它最初放在那里的东西。

在任何Python文档中我都找不到任何表明这是必需的行为,而不仅仅是实现的偶然事件。

这有多安全?还有哪些其他方法可以尝试实现类似的“引导”效果?

0 个答案:

没有答案