2012-10-10 48 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

相關問題