Импорт трассировки Python

Моя библиотека Python просто изменила имя основного модуля от foo.bar до foobar. Для обратной совместимости foo.bar все еще существует, но при импорте возникает несколько предупреждений. Теперь, кажется, какой-то пример программы по-прежнему импортируется из старого модуля, но не напрямую.

Я хотел бы найти ошибочный оператор import. Есть ли какой-либо инструмент, который позволяет мне отслеживать импорт и находить виновника без прошивки через весь код?

Ответ 1

Запустите интерпретатор 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
...

Затем просто grep для вашего старого модуля.

Ответ 2

отредактируйте модуль foo.bar, добавьте следующий код:

import pdb
pdb.set_trace()

когда импортируется foo.bar, программа остановится на pdb.set_trace() в режиме pdb, где вы можете отлаживать свой код. Например, вы можете использовать команду "w" для печати полного стека вызовов.