如何跟踪python导入

Jef*_*eff 21 python import

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

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

App1 >>imports>> App2,App3.method
App2 >>imports>> App3,etc
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lli 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
Run Code Online (Sandbox Code Playgroud)

例如,(保存了这个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__
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,"包装" __import__内置的一个特定特征是它不会被导入的模块已经存在的事实所沉默sys.modules:因为处理这是一个__import__工作,我们的包装器得到了要求两个模块"第一次加载" 那些刚刚被取出的模块,sys.modules因为它们之前已被导入.当您尝试诊断循环导入时,这应该非常方便(归结为在有向图中找到循环,其边缘由两个模块名称标识 - 导入和导入 - 这种简单的方法在每个模块上打印输出线).


Ned*_*der 9

尝试使用python -v运行程序.它将跟踪进口顺序.

另一种选择是pylint,它会提醒您各种问题,包括循环导入.

  • 我想在uwsgi下运行python时使用这个-v选项.我最后将这个添加到我的uwsgi ini文件中:`env = PYTHONVERBOSE = 1`并且输出进入正常uwsgi日志文件中指定的内容. (3认同)