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