web-dev-qa-db-fra.com

Trace Python importe

Ma Python vient de changer son nom de module principal de foo.bar à foobar. Pour la compatibilité descendante, foo.bar existe toujours, mais son importation déclenche quelques avertissements. Maintenant, il semble qu'un exemple de programme soit toujours importé de l'ancien module, mais pas directement.

Je voudrais trouver l'instruction import erronée. Existe-t-il un outil qui me permette de suivre les importations et de trouver le coupable sans parcourir tout le code?

41
Fred Foo

Démarrez l'interpréteur python avec -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
...

Ensuite, grep pour votre ancien module.

63
Torsten Marek

éditez le module foo.bar, ajoutez le code suivant:

import pdb
pdb.set_trace()

lorsque foo.bar sera importé, le programme s'arrêtera à pdb.set_trace () en mode pdb, où vous pourrez déboguer votre code. Par exemple, vous pouvez utiliser la commande "w" pour imprimer la pile d'appel complète.

7
HYRY