6

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

4

1 回答 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 回答