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,而我的程序会打印所有内容)。
我找到了这段用于打印程序跟踪的代码,它在 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,而我的程序会打印所有内容)。