我有周期性的导入问题,为一个非常大的应用程序添加了一些新代码,我正在尝试确定哪些文件最可能的原因。有没有办法跟踪哪些文件导入哪些文件?我做了一些查找并找到了python trace命令,但它只显示了主python库中的一堆活动。
我基本上正在寻找一个能给我看的东西:
App1 >>imports>> App2,App3.method
App2 >>imports>> App3,etc
我可以查看我的所有文件,但我不愿意,这是一个很棒的应用程序。
答案 0 :(得分:14)
这是一个简单的(并且略有基础;-)方式来跟踪“谁试图导入什么”模块名称:
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__
的工作之一,我们的包装器被调用为两个模块“第一次加载”和那些将从{{1>获取的模块因为它们之前已经导入过了。当您尝试诊断循环导入时,这应该非常方便(归结为在有向图中找到循环,其边缘由两个模块名称标识 - 导入和导入 - 这种简单方法在每个模块上打印输出线)。
答案 1 :(得分:11)
您可以使用其中一个脚本来创建python模块依赖关系图:
答案 2 :(得分:9)
尝试使用python -v
来运行您的程序。它将追踪进口顺序。
另一个选项是pylint,它会提醒您各种问题,包括循环导入。
答案 3 :(得分:1)
答案 4 :(得分:-3)
在python中不可能获得循环导入,因为它会在再次导入之前检查模块是否已导入。无论您调用导入多少次,都只能导入一次模块。
来自http://groups.google.com/group/comp.lang.python/browse_thread/thread/1d80a1c6db2b867c?pli=1:
进口非常简单 真。请记住以下内容:
'import'和'from xxx import yyy'是 可执行语句。他们执行 当正在运行的程序到达那个 线。
如果模块不在sys.modules中, 然后导入创建新模块 在sys.modules中输入然后执行 模块中的代码。它不是 将控制权返回给调用模块 直到执行完成。
如果sys.modules中存在模块 然后导入只是返回 模块是否已完成 执行。这就是原因 循环导入可能会返回模块 似乎部分是空的。
最后,执行脚本运行 一个名为__main__的模块,导入 将创建自己名称下的脚本 一个与之无关的新模块 __main __。
把这个地方和你一起拿走 什么时候不应该有任何惊喜 导入模块。