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

Python Trace Tables and ver 2 to ver 3 issue

我找到了这段用于打印程序跟踪的代码,它在 Python2 中运行良好。

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

的错误

我在这里超出了我的深度 - 我只是想要一种简单的方法来逐行跟踪程序中的变量 - 我喜欢这个程序的工作方式并且让它与 [=25= 一起工作会很棒] 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

该程序有几个主要缺陷 - 例如,如果被跟踪的程序包含任何带有局部变量的函数,它就会崩溃,即使在 Python 2.

因此,因为我没有更好的事可做,所以我写了一个程序来做这样的事情,叫做 pytrace。它是为 Python 3.6 编写的,尽管如果需要的话,它可能不会花太长时间就可以在较低版本上运行。

它的输出与您的程序略有不同,但差异不大 – 唯一缺少的是行号,我想您可以很容易地添加行号(在适当的位置打印 frame.f_lineno)。剩下的就是数据的呈现方式(您的程序将所有输出存储到最后,因此它可以计算 table headers,而我的程序会打印所有内容)。