【发布时间】:2018-05-04 13:06:35
【问题描述】:
我的 Python 库刚刚将其主模块名称从 foo.bar 更改为 foobar。对于向后兼容,foo.bar 仍然存在,但导入它会引发一些警告。现在,似乎一些示例程序仍然从旧模块导入,但不是直接导入。
我想找出错误的import 语句。是否有任何工具可以让我跟踪导入并找到罪魁祸首,而无需涉足所有代码?
【问题讨论】:
标签: python debugging import trace
我的 Python 库刚刚将其主模块名称从 foo.bar 更改为 foobar。对于向后兼容,foo.bar 仍然存在,但导入它会引发一些警告。现在,似乎一些示例程序仍然从旧模块导入,但不是直接导入。
我想找出错误的import 语句。是否有任何工具可以让我跟踪导入并找到罪魁祸首,而无需涉足所有代码?
【问题讨论】:
标签: python debugging import trace
用-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 查找您的旧模块。
【讨论】:
PYTHONVERBOSE 的值越高,信息就越多。如果 1 只说明从哪里挑选东西,则更高的数字将导致消息显示尝试了哪些路径。在弄清楚为什么找不到包时有很大帮助。
import site?是timeit.py吗?还是zipimport?在更复杂的环境中,我需要知道踪迹,但找不到。
编辑 foo.bar 模块,添加如下代码:
import pdb
pdb.set_trace()
当 foo.bar 被导入时,程序将在 pdb 模式下停在 pdb.set_trace() 处,您可以在此处调试代码。例如,您可以使用“w”命令打印完整的调用堆栈。
【讨论】: