这里有一个简单(略简陋;-)方式追查“是谁在试图导入什么”,在模块名称方面:
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