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

How to patch a Python 3 module on first import?

假设我想动态修补 tkinter.Tk 以使 windows 保持领先。如果我确定以下代码确实使用了 Tkinter,那么我可以 import tkinter 在其余代码之前执行必要的更新。

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

我知道 sys.path_hookssys.meta_path,但我希望有更简单的东西。我不想更改查找或加载机制,我只想在导入模块对象传递给导入模块之前获取它。

我不需要支持 Python 早于 3.5 的版本。

我选择了环绕 builtins.__import__:

This function is invoked by the import statement. It can be replaced (by importing the builtins module and assigning to builtins.__import__) in order to change semantics of the import statement

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