我发现此代码可用于打印程序跟踪,并且在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
答案 0 :(得分:1)
该程序有两个主要缺陷–例如,如果要跟踪的程序包含具有局部变量的任何函数,即使在Python 2中,该程序也会崩溃。
因此,由于我无事可做,因此我编写了一个程序来执行类似这样的操作pytrace。它是为Python 3.6编写的,尽管如果需要的话,使其在较低版本上运行可能不会花费太长时间。
它的输出与程序的输出稍有不同,但是并没有很大的不同–唯一缺少的是行号,我想您可以很容易地添加行号(在适当的位置打印frame.f_lineno
)。其余的纯粹是数据的显示方式(您的程序将所有输出存储到最后,以便可以计算出表头,而我的将按时打印所有内容)。