如何跟踪python导入

2024-04-28 19:26:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我基本上是在找一个可以显示如下内容的应用程序:

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

我可以浏览我所有的文件,但我不想,这是一个很大的应用程序。


Tags: 文件代码命令应用程序内容trace情况原因
3条回答

尝试使用python -v运行程序。它将跟踪导入的顺序。

另一个选项是pylint,它将提醒您注意各种问题,包括循环导入。

这里有一个简单的(略显初级的;-)方法来跟踪“谁试图导入什么”的模块名:

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获取,因为它们以前已经被导入。当您试图诊断循环导入时,这应该非常有用(它可以归结为在有向图中查找循环,循环的边由两个模块名标识(imported和importer),这个简单的方法是在每个输出行上打印这两个模块名)。

相关问题 更多 >