0

我确实有很多 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
4

2 回答 2

2

我猜对了——Python TypeError: need more than 0 values to unpack is because of the statement

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
于 2013-08-22T08:04:27.570 回答
1

首先使用“import traceback”怎么样?然后 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
于 2013-08-22T08:04:43.483 回答