Python跟踪表和版本2至版本3问题

时间:2018-07-03 16:17:58

标签: python python-3.x trace

我发现此代码可用于打印程序跟踪,并且在Python2中可以正常工作。

但是,在Python 3中存在问题。我通过将execfile(file_name)替换为exec(open(filename).read())来解决第一个问题,但是现在仍然存在错误KeyError: 'do_setlocale'

我不在这里-我只想一种简单的方法来逐行跟踪程序中的变量-我喜欢该程序的工作方式,并且使其与Python 3一起工作非常好。我什至尝试了一个在线转换程序,但得到了相同的KeyError: 'do_setlocale'

任何人都可以帮助我使其正常工作吗?

import sys

if len(sys.argv) < 2:
        print __doc__
        exit()
else:
        file_name = sys.argv[1]

past_locals = {}
variable_list = []
table_content = ""

ignored_variables = set([
        'file_name',
        'trace',
        'sys',
        'past_locals',
        'variable_list',
        'table_content',
        'getattr',
        'name',
        'self',
        'object',
        'consumed',
        'data',
        'ignored_variables'])

def trace(frame, event, arg_unused):
        global past_locals, variable_list, table_content, ignored_variables
        relevant_locals = {}
        all_locals = frame.f_locals.copy()
        for k,v in all_locals.items():
                 if not k.startswith("__") and k not in ignored_variables:
                            relevant_locals[k] = v
        if len(relevant_locals) > 0 and past_locals != relevant_locals:
                 for i in relevant_locals:
                            if i not in past_locals:
                                     variable_list.append(i)
                 table_content += str(frame.f_lineno) + " || "
                 for variable in variable_list:
                            table_content += str(relevant_locals[variable]) + " | "
                 table_content = table_content[:-2]
                 table_content += '\n'
                 past_locals = relevant_locals
        return trace

sys.settrace(trace)

execfile(file_name)

table_header = "L || "
for variable in variable_list:
        table_header += variable + ' | '
table_header = table_header[:-2]
print table_header
print table_content

# python traceTable.py problem1.py

# problem1.py
a = 1
b = 2

a = a + b

1 个答案:

答案 0 :(得分:1)

该程序有两个主要缺陷–例如,如果要跟踪的程序包含具有局部变量的任何函数,即使在Python 2中,该程序也会崩溃。

因此,由于我无事可做,因此我编写了一个程序来执行类似这样的操作pytrace。它是为Python 3.6编写的,尽管如果需要的话,使其在较低版本上运行可能不会花费太长时间。

它的输出与程序的输出稍有不同,但是并没有很大的不同–唯一缺少的是行号,我想您可以很容易地添加行号(在适当的位置打印frame.f_lineno)。其余的纯粹是数据的显示方式(您的程序将所有输出存储到最后,以便可以计算出表头,而我的将按时打印所有内容)。