最近我遇到了一些使用使我颇为紧张的把戏的代码。我正在查看的系统在路径外部存储了一个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文档中我都找不到任何表明这是必需的行为,而不仅仅是实现的偶然事件。
这有多安全?还有哪些其他方法可以尝试实现类似的“引导”效果?