【问题标题】:Trace Python imports跟踪 Python 导入
【发布时间】:2018-05-04 13:06:35
【问题描述】:

我的 Python 库刚刚将其主模块名称从 foo.bar 更改为 foobar。对于向后兼容,foo.bar 仍然存在,但导入它会引发一些警告。现在,似乎一些示例程序仍然从旧模块导入,但不是直接导入。

我想找出错误的import 语句。是否有任何工具可以让我跟踪导入并找到罪魁祸首,而无需涉足所有代码?

【问题讨论】:

    标签: python debugging import trace


    【解决方案1】:

    -v启动python解释器:

    $ 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
    ...
    

    然后只需 grep 查找您的旧模块。

    【讨论】:

    • 另外,如果你无法访问 Python 命令行(例如,解释器是嵌入的),那么你可以在环境中将 PYTHONVERBOSE 设置为 1 以获得相同的效果。
    • 这是一个真正有用的技巧。通常,导入在 shell 中运行良好,并在路径不同的服务器设置中崩溃。当您不在 Python shell 中时,将这个技巧与 PYTHONVERBOSE 一起使用是一种救命稻草。
    • 顺便说一下,PYTHONVERBOSE 的值越高,信息就越多。如果 1 只说明从哪里挑选东西,则更高的数字将导致消息显示尝试了哪些路径。在弄清楚为什么找不到包时有很大帮助。
    • 这不会为导入提供堆栈跟踪。哪个文件名为import site?是timeit.py吗?还是zipimport?在更复杂的环境中,我需要知道踪迹,但找不到。
    【解决方案2】:

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

    import pdb
    pdb.set_trace()
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多