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

and*_*ieb 3 python

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

mgi*_*nbr 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
Run Code Online (Sandbox Code Playgroud)

它在命令行上运行良好(在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'>
Run Code Online (Sandbox Code Playgroud)

更新:刚刚确认它在python文件中使用也有效 - 尽管在这种情况下,正确的分配方式是__builtins__['__import__'] = my_import.