web-dev-qa-db-ja.com

トレースPythonインポート

私のPythonライブラリは、メインモジュール名をfoo.barからfoobarに変更しました。下位互換性のために、foo.barはまだ存在しますが、インポートするといくつか発生します。現在、いくつかのサンプルプログラムはまだ古いモジュールからインポートしていますが、直接ではないようです。

誤ったimportステートメントを見つけたいのですが。すべてのコードを調べずにインポートを追跡して原因を特定できるツールはありますか?

41
Fred Foo

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します。

63
Torsten Marek

foo.barモジュールを編集し、次のコードを追加します。

import pdb
pdb.set_trace()

foo.barがインポートされると、プログラムはpdbモードのpdb.set_trace()で停止し、コードをデバッグできます。たとえば、「w」コマンドを使用して、完全な呼び出しスタックを出力できます。

7
HYRY