如何跟踪python导入

时间:2009-11-28 00:15:35

标签: python import

我有周期性的导入问题,为一个非常大的应用程序添加了一些新代码,我正在尝试确定哪些文件最可能的原因。有没有办法跟踪哪些文件导入哪些文件?我做了一些查找并找到了python trace命令,但它只显示了主python库中的一堆活动。

我基本上正在寻找一个能给我看的东西:

App1 >>imports>> App2,App3.method
App2 >>imports>> App3,etc

我可以查看我的所有文件,但我不愿意,这是一个很棒的应用程序。

5 个答案:

答案 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)

也许迟到但你一定要看看

https://github.com/boris-42/profimp

enter image description here

答案 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 __。

     

把这个地方和你一起拿走   什么时候不应该有任何惊喜   导入模块。