Python:强制每次导入重载
有没有办法让 import x
每次都重新加载 x
,就像我调用了 reload(x)
或者在 Python 3 中调用 imp.reload(x)
一样?或者说,有没有什么方法可以让每次执行 import x
时都运行一些代码?我可以接受一些小技巧或者黑科技。
我试过把代码放到一个单独的模块里,然后在那个文件中把 x
从 sys.modules
删除。我也尝试过使用导入钩子,但没有深入研究,因为根据文档,它们只会在检查完 sys.modules
的缓存后才被调用。我还试过用一个自定义的字典子类来修改 sys.modules
,但每次这样做时,执行 from module import submodule
就会报 KeyError
(我猜 sys.modules
不是一个真正的字典)。
总的来说,我想写一个调试工具(所以这里可以接受一些小技巧)。我的目标就是让 import x
比 import 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__
。