有没有办法做某事(例如打印“funkymodule import”)从任何其他模块导入模块的每个时间?它不仅第一次导入运行时还是重新加载?
答案 0 :(得分:6)
一种可能性是修补补丁__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
。