每次从任何其他模块导入模块时,有没有办法做某事(例如打印“funkymodule import”) ?不仅是第一次导入运行时或重新加载?
问问题
1109 次
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
.
于 2013-02-08T17:58:16.497 回答