如何在首次导入时修补Python 3模块?

艾瓦尔

假设我要动态修补tkinter.Tk以使窗口停留在最前面。如果我确定以下代码确实使用了Tkinter,则可以import tkinter在其余代码之前执行必要的更新。

但是如何按需设置模块补丁,即。仅当其余代码真正导入模块时?

我了解sys.path_hookssys.meta_path,但是希望有一些简单的方法。我不想更改查找或加载机制,我只想在将导入的模块对象传递给导入模块之前对其进行控制。

我不需要支持3.5以上的Python版本。

艾瓦尔

我选择包装builtins.__import__

此功能由import语句调用。可以替换它(通过导入Builtins模块并分配给builtins.__import__),以更改import语句的语义

import builtins
original_import = builtins.__import__

def custom_import(*args, **kw):
    module = original_import(*args, **kw)

    if (module.__name__ == "interesting_module" 
        and not getattr(module, "patch_is_performed", False)):
        patch(module)
        module.patch_is_performed = True

    return module

builtins.__import__ = custom_import

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章