2014-01-12 61 views
0

我想在Python中編寫一個腳本,它將讀取任何搜索函數定義的python腳本,並在函數內部添加打印語句以進行調試。將行添加到Python文件進行調試

例如

def function_for_test: 
    print "this line should be added for debugging purpose" 
    more code here.... 
    more code here.... 

到目前爲止,我有這樣的代碼

import os 
import re 
import sys 

match_class = re.compile(r'^[ \t]*(def|class)[ \t]+([a-zA-Z_][a-zA-Z0-9_]*)[ \t]*[:\(]') 


for root, dirs, files in os.walk(sys.argv[1]): 
     for fn in files: 
       if fn.endswith(".py"): 
         with open(os.path.join(root, fn), "r+") as source: 
             while True: 
               line = source.readline() 
               if line == "": break 
               m = match_class.match(line.expandtabs()) 
               if m: 
                 print m.groups() 

我在麻煩,因爲,如果我嘗試寫文,現有的文本越來越寫上運行。任何人都可以請建議一些方法來克服這一點。我不想爲此創建另一個文件,並且將文本從原始文件複製到新文件中

+0

你有沒有使用sys.settrace功能考慮。這可以用於每次執行一個函數時執行一個函數,所以可能會滿足您的需求,而不需要解析和修改軟件包源代碼?> – James

+0

我將嘗試閱讀有關settrace ....我需要的是隻要項目中的任何函數得到執行,它就會將輸出打印到命令行或文本文件;這樣我可以跟蹤項目的整個流程。我不應該使用調試這個詞......我需要跟蹤當我使用該程序執行某些操作時被調用的所有函數。例如如果我點擊一個GUI按鈕,如果源代碼中的所有函數都會在調用時在文本文件中打印一行,這樣我就可以知道哪些函數被調用。 – anukalp

回答

1

如果不重寫所有下游內容,則無法向文件添加內容。

您可以使用以下邏輯:

​​

哪裏instrument_code是你的代碼,修改源文件。

+0

嗨Yossi,謝謝....我已經根據你的邏輯修改了腳本! – anukalp

1

Settrace可能被用來滿足這個要求。請注意,會有性能開銷,並且可能會有更好的方法..但是,這可能是一種快速(從編碼的角度來看)的方式來滿足您的要求。

例如

import sys 

def trace_f(frame, event, arg): 
    if event == "call": 
     print 'Execute {f} '.format(f=frame.f_code) 

現在定義一個簡單的示例功能來跟蹤

def multiply_by_two(x): 
    print x*2 

,並激活跟蹤

sys.settrace(trace_f) 

multiply_by_two(12) 
相關問題