我有一个庞大的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.
Run Code Online (Sandbox Code Playgroud)
嗯,这不是真的.例如:
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
Run Code Online (Sandbox Code Playgroud)
如您所见,该-v标志只是向我提供有关导入哪些模块的信息,而不是关于哪个import语句,哪个文件/行触发导入.使用-vv不会改变任何东西(显示已尝试模块的列表,但没有关于为什么首先尝试导入)
但我需要确切地知道:哪个import语句,哪个文件/行触发那些导入.我怎样才能获得这些信息?
导入钩子!只需将此代码添加到主脚本入口点,即可在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())
Run Code Online (Sandbox Code Playgroud)
测试:
def foo():
import test
import this
foo()
Run Code Online (Sandbox Code Playgroud)
输出:
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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |