Python回溯到类末尾打印堆栈

时间:2013-08-22 07:42:35

标签: python

我有很多python类,它们动态地导入并运行多个测试脚本(它就像一个测试自动化工具)。日志记录也很清楚,它在正确的测试脚本中报告了一些错误。但是,错误发生在测试脚本使用的某个库中。错误是非常常见的pythonic错误 -       - 需要超过0个值来解压

库代码太大,日志记录不提供库中发生此错误的行/语句的任何信息。

我无法找出有缺陷的线路。我应该在哪里打印回溯堆栈?

有没有什么方法可以打印整个追溯到终止程序?

更新:

添加许多调试语句后,脚本在此函数中失败 -

def _print_pretty_results(self,diff):
    count = 1
    str = ''
    #Calculate Screen Buffer Size
    rows, columns = os.popen('stty size', 'r').read().split()
    for err in diff:
        err_dict = diff[err]
        for key in err_dict:
            exp_val = err_dict[key]["Exp"]
            act_val = err_dict[key]["Act"]
            str += "_"*int(columns)
            str += "\n\nMISMATCH NO. %d\n" % count
            str += "_"*int(columns)
            str += "\n\nAttribute : %s" % key
            str += "\nExpected  : %s" % exp_val
            str += "\nActual    : %s\n" % act_val
            count += 1


    str += "_"*int(columns)+"\n"
    return str

2 个答案:

答案 0 :(得分:2)

我猜对了 - Python TypeError:由于语句

,需要多于0个值才能解压缩
rows, columns = os.popen('stty size', 'r').read().split()

这里的问题是,上面的语句将计算缓冲区大小,并且您不允许脚本通过将输出重定向到某个文件来访问屏幕缓冲区,并且使用nohup命令在后台运行也是如此。

以下是我尝试过的示例代码 -

import os
rows, columns = os.popen('stty size', 'r').read().split()
print rows
print columns

我运行此脚本的方式有四种 -

输出1

[root@localhost]# python test.py
44
168

输出2

[root@localhost]# python test.py > /tmp/out.log
[root@localhost]#

[root@localhost]# cat /tmp/out.log
44
168

输出3

[root@localhost]# python test.py > /tmp/out.log &
[root@localhost]#

[root@localhost]# cat /tmp/out.log
44
168

输出4

[root@localhost]# nohup python test.py > /tmp/out.log &
[root@localhost]#

[root@localhost]# cat /tmp/out.log
stty: standard input: Inappropriate ioctl for device
Traceback (most recent call last):
  File "test.py", line 2, in <module>
    rows, columns = os.popen('stty size', 'r').read().split()
ValueError: need more than 0 values to unpack

答案 1 :(得分:1)

首先使用“导入追溯”怎么样? 然后pdb.set_trace()以交互方式进行调试;

def _print_pretty_results(self,diff):
    count = 1
    str = ''

    try:
        #Calculate Screen Buffer Size
        rows, columns = os.popen('stty size', 'r').read().split()
        for err in diff:
            err_dict = diff[err]
            for key in err_dict:
                exp_val = err_dict[key]["Exp"]
                act_val = err_dict[key]["Act"]
                str += "_"*int(columns)
                str += "\n\nMISMATCH NO. %d\n" % count
                str += "_"*int(columns)
                str += "\n\nAttribute : %s" % key
                str += "\nExpected  : %s" % exp_val
                str += "\nActual    : %s\n" % act_val
                count += 1


        str += "_"*int(columns)+"\n"
    catch Exception, e:
        traceback.print_exc()
        import pdb; pdb.set_trace()
    return str