這裏有一個簡單(略簡陋;-)方式追查「是誰在試圖導入什麼」,在模塊名稱方面:
import inspect
import __builtin__
savimp = __builtin__.__import__
def newimp(name, *x):
caller = inspect.currentframe().f_back
print name, caller.f_globals.get('__name__')
return savimp(name, *x)
__builtin__.__import__ = newimp
賦予,例如(救以此爲tracimp.py
):
$ python -c 'import tracimp; import email; import sys; import email.mime'
email __main__
sys email
email.mime email
sys __main__
email.mime __main__
正如你看到的,「包裝」的__import__
內置的一個具體特點是:它不會被一個事實,即模塊被進口的沉默已經在sys.modules
:因爲照顧是__import__
的工作之一,我們的包裝被稱爲兩個模塊「第一次加載」和,因爲它們以前已經導入過,所以它們只會從sys.modules
獲取。當您嘗試診斷循環導入時,這應該非常方便(它歸結爲在有向圖中查找循環,其邊界由兩個模塊名稱 - 導入和導入器 - 這種簡單方法在每個模塊上打印輸出線)。
Snakefood最終成爲我想要的。它需要一些按摩才能使它適用於大量的文件。 – Jeff 2009-12-01 21:12:54
@Jeff:是的,它需要一些工作來設置和閱讀文檔是必須的。我很高興你能夠實現它的工作! – unutbu 2009-12-01 21:57:13