跟踪Python导入

Fre*_*Foo 39 python debugging import trace

我的Python库只是改变了它是从主模块的名称foo.barfoobar.对于后向compat,foo.bar仍然存在,但导入它会引发一些警告.现在,似乎一些示例程序仍然从旧模块导入,但不是直接导入.

我想找到错误的import陈述.是否有任何工具允许我跟踪导入并找到罪魁祸首而不涉及所有代码?

Tor*_*rek 59

启动python解释器-v:

$ python -v -m /usr/lib/python2.6/timeit.py
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# /usr/lib/python2.6/site.pyc matches /usr/lib/python2.6/site.py
import site # precompiled from /usr/lib/python2.6/site.pyc
# /usr/lib/python2.6/os.pyc matches /usr/lib/python2.6/os.py
import os # precompiled from /usr/lib/python2.6/os.pyc
import errno # builtin
import posix # builtin
# /usr/lib/python2.6/posixpath.pyc matches /usr/lib/python2.6/posixpath.py
import posixpath # precompiled from /usr/lib/python2.6/posixpath.pyc
# /usr/lib/python2.6/stat.pyc matches /usr/lib/python2.6/stat.py
import stat # precompiled from /usr/lib/python2.6/stat.pyc
# /usr/lib/python2.6/genericpath.pyc matches /usr/lib/python2.6/genericpath.py
import genericpath # precompiled from /usr/lib/python2.6/genericpath.pyc
# /usr/lib/python2.6/warnings.pyc matches /usr/lib/python2.6/warnings.py
import warnings # precompiled from /usr/lib/python2.6/warnings.pyc
# /usr/lib/python2.6/linecache.pyc matches /usr/lib/python2.6/linecache.py
import linecache # precompiled from /usr/lib/python2.6/linecache.pyc
# /usr/lib/python2.6/types.pyc matches /usr/lib/python2.6/types.py
import types # precompiled from /usr/lib/python2.6/types.pyc
# /usr/lib/python2.6/UserDict.pyc matches /usr/lib/python2.6/UserDict.py
...
Run Code Online (Sandbox Code Playgroud)

然后只需grep你的旧模块.

  • 此外,如果您无法访问Python命令行(例如,嵌入了解释器),则可以在环境中将PYTHONVERBOSE设置为1以获得相同的效果. (26认同)
  • 顺便说一句,更高的"PYTHONVERBOSE"值会提供更多信息.如果1仅告知拾取事物的位置,则更高的数字将导致显示尝试路径的消息.在弄清楚为什么找不到包裹时会有很多帮助. (3认同)
  • 这不提供导入的堆栈跟踪。哪个文件名为“导入站点”?是“timeit.py”吗?或者是“zipimport”?在更复杂的环境中,我需要知道踪迹,但找不到踪迹。 (2认同)

HYR*_*YRY 5

编辑foo.bar模块,添加以下代码:

import pdb
pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

当导入foo.bar时,程序将在pdb模式下停在pdb.set_trace(),您可以在其中调试代码.例如,您可以使用"w"命令打印完整的调用堆栈.