每次导入模块时都要执行某些操作

时间:2013-02-08 17:49:24

标签: python

有没有办法做某事(例如打印“funkymodule import”)从任何其他模块导入模块的每个时间?它不仅第一次导入运行时还是重新加载?

1 个答案:

答案 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