如何在首次导入时修补 Python 3 模块?
How to patch a Python 3 module on first import?
假设我想动态修补 tkinter.Tk
以使 windows 保持领先。如果我确定以下代码确实使用了 Tkinter,那么我可以 import tkinter
在其余代码之前执行必要的更新。
但是如何设置模块按需打补丁,即。仅当其余代码真正导入模块时?
我知道 sys.path_hooks
和 sys.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
假设我想动态修补 tkinter.Tk
以使 windows 保持领先。如果我确定以下代码确实使用了 Tkinter,那么我可以 import tkinter
在其余代码之前执行必要的更新。
但是如何设置模块按需打补丁,即。仅当其余代码真正导入模块时?
我知道 sys.path_hooks
和 sys.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