将行添加到Python文件以进行调试

时间:2014-01-12 12:47:26

标签: python file

我正在尝试用Python编写一个脚本,它将读取任何搜索函数定义的python脚本,并在函数内部添加一个print语句以进行调试。

e.g。

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

我遇到了麻烦,因为如果我尝试写文本,现有的文本就会被写入。任何人都可以建议一些方法来克服这个问题。我不想为此目的创建另一个文件,并将文本从原始文件复制到新文件并进行修改

2 个答案:

答案 0 :(得分:1)

如果不重写所有下游内容,则无法向文件添加内容。

您可以使用以下逻辑:

with open(filename, 'r+') as f:
    lines = f.readlines()
    modified_lines = instrument_code(lines)

    f.seek(0)  # Go back to file start
    f.writelines(modified_lines)

    # Remove trailing content in case your file is shorter than original
    f.truncate()  

instrument_code是修改源文件的代码。

答案 1 :(得分: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)