Python:强制每次导入重载

2 投票
2 回答
794 浏览
提问于 2025-04-17 20:19

有没有办法让 import x 每次都重新加载 x,就像我调用了 reload(x) 或者在 Python 3 中调用 imp.reload(x) 一样?或者说,有没有什么方法可以让每次执行 import x 时都运行一些代码?我可以接受一些小技巧或者黑科技。

我试过把代码放到一个单独的模块里,然后在那个文件中把 xsys.modules 删除。我也尝试过使用导入钩子,但没有深入研究,因为根据文档,它们只会在检查完 sys.modules 的缓存后才被调用。我还试过用一个自定义的字典子类来修改 sys.modules,但每次这样做时,执行 from module import submodule 就会报 KeyError(我猜 sys.modules 不是一个真正的字典)。

总的来说,我想写一个调试工具(所以这里可以接受一些小技巧)。我的目标就是让 import ximport x;x.y 更简短易打。

2 个回答

3

如果你真的想改变 import 这个语句的功能,你就得修改解释器的代码。import 会检查你要导入的模块是否已经加载,如果已经加载了,它就什么都不做。你需要改变这个行为,而这个功能是直接写死在解释器里的。

也许你可以考虑修改Python的源代码,用 myImport('modulename') 来代替 import modulename?这样在Python内部就可以实现你想要的功能了。

1

根据Alfe的回答,我让它这样工作。这个代码放在模块的最上面。

def custom_logic():
    # Put whatever you want to run when the module is imported here

# This version is run on the first import
custom_logic()

def __myimport__(name, *args, **kwargs):
    if name == 'x': # Replace with the name of this module
        # This version is run on all subsequent imports
        custom_logic()
    return __origimport__(name, *args, **kwargs)

# Will only be run on first import
__builtins__['__origimport__'] = __import__
__builtins__['__import__'] = __myimport__

我们在修改__builtins__,这就是为什么在运行__myimport__时会定义__origimport__

撰写回答