6

モジュールが他のモジュールからインポートされるたびに何かを行う方法はありますか (たとえば、print "funkymodule imported" など) 。初めてランタイムにインポートされたときやリロードされたときだけではありませんか?

4

1 に答える 1

8

1 つの可能性は、monkey patch__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 に答える