3

Python モジュールの大きなライブラリがあります。モジュールをインポートするときに、予期しないモジュールがインポートされていることに気付くことがあります。このために、python -vどのモジュールがインポートされているかを確認するために を使用しています。マンページから:

-v     Print  a  message  each  time a module is initialized, showing the place
       (filename or built-in module) from which it is loaded.  When given twice,
       print a message for each file that is checked for when searching for a
       module.  Also provides information on module cleanup at exit.

まあ、これは真実ではありません。例えば:

import portalmq # directory /home/blahblah/python_modules/portalmq
# /home/blahblah/python_modules/portalmq/__init__.pyc matches /home/blahblah/python_modules/portalmq/__init__.py
import portalmq # precompiled from /home/blahblah/python_modules/portalmq/__init__.pyc

ご覧のとおり、-vフラグはどのモジュールがインポートされたかについての情報を提供するだけで、どのインポートステートメント、どのファイル/行がインポートをトリガーしているかについての情報は提供しません。を使用-vvしても何も変わりません (試行されたモジュールのリストが表示されますが、最初にインポートが試行された理由については何もありません)。

しかし、私はそれを正確に知る必要があります:どのインポートステートメントで、どのファイル/行がそれらのインポートをトリガーしているか. どうすればこの情報を入手できますか?

4

1 に答える 1

5

輸入フック!このコードをメイン スクリプト エントリ ポイントに追加するだけで、実行後のすべてのインポートを追跡できますsys.meta_path.append

import traceback

class TracingFinder:
    def find_module(self, fullname, path=None):
        print 'loading module', fullname
        traceback.print_stack()

import sys
sys.meta_path.append(TracingFinder())

テスト:

def foo():
    import test
    import this

foo()

出力:

loading module test
  File "moo.py", line 15, in <module>
    foo()
  File "moo.py", line 12, in foo
    import test
  File "moo.py", line 6, in find_module
    traceback.print_stack()
loading module this
  File "moo.py", line 15, in <module>
    foo()
  File "moo.py", line 13, in foo
    import this
  File "moo.py", line 6, in find_module
    traceback.print_stack()
于 2012-10-10T06:47:09.037 に答える