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

6 投票
1 回答
1698 浏览
提问于 2025-04-17 15:16

有没有办法在每次从其他模块导入一个模块时,做一些事情(比如打印“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

撰写回答