2012-10-10 52 views
3

我有一个很大的python模块库。有时,在导入模块时,我发现导入了意外的模块。为此,我一直在使用python -v来查看哪些模块正在导入。从手册页:如何检查为什么要导入一个python模块?

-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不会改变任何东西(显示可用模块的列表,但没有说明为什么导入首先被试用)

但我需要确切地知道:哪个导入语句,其中文件/行是触发这些进口。我如何获得这些信息?

+0

略相关:http://stackoverflow.com/questions/5983522/ – n611x007

回答

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() 
+0

什么!不要告诉我,python二进制文件无法提供这个信息的开箱即用! – dangonfast

+0

你发布的是正在工作,谢谢。尽管如此,我仍然感到惊讶的是,python无法给我这些信息而没有额外的黑客攻击。 – dangonfast

+1

@gonvaled:是否有口译员会提供这些信息?这里只需添加几行代码就可以添加这个工具,而且它非常灵活(你可以用导入钩子做很多事情)。 – nneonneo

相关问题