每次导入模块时执行某些操作
有没有办法在每次从其他模块导入一个模块时,做一些事情(比如打印“funkymodule imported”)?不仅仅是在第一次导入到运行时或者重新加载的时候?
1 个回答
8
一种可能的方法是修改 __import__
函数:
>>> old_import = __import__
>>> def my_import(module,*args,**kwargs):
... print module, 'loaded'
... return old_import(module,*args,**kwargs)
...
>>> __builtins__.__import__ = my_import
>>> import datetime
datetime loaded
>>> import datetime
datetime loaded
>>> import django
django loaded
在命令行上运行得很好(我是在 Windows XP 上用 Python 2.7.3),但我不确定在其他环境下是否也能正常工作。
如果你想获取模块对象(而不仅仅是模块名称,这样你才能做一些有用的事情),你只需要拦截返回值,而不是参数:
>>> def my_import(*args,**kwargs):
... ret = old_import(*args,**kwargs)
... print ret
... return ret
...
>>> __builtins__.__import__ = my_import
>>> import datetime
<module 'datetime' (built-in)>
>>> import django
<module 'django' from 'C:\Python27\lib\site-packages\django\__init__.pyc'>
更新: 我刚确认在 Python 文件中使用也能正常工作 - 不过在这种情况下,正确的赋值方式是 __builtins__['__import__'] = my_import
。