Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在可用时记录结果,而不会在崩溃期间丢失?_Python_Logging - Fatal编程技术网

Python 如何在可用时记录结果,而不会在崩溃期间丢失?

Python 如何在可用时记录结果,而不会在崩溃期间丢失?,python,logging,Python,Logging,我有一组Python测试脚本,它执行案例,然后将结果记录在日志文件中——每次都在测试案例结束时。这种方法的问题是,如果我的程序意外崩溃,日志文件将不会生成。这是我的测试脚本示例 id = "mytest" def scr1(control, log): res = False try: log.opencase(id) log_format = "result 1 {:s}; result 2 {:s};" #sample ste

我有一组Python测试脚本,它执行案例,然后将结果记录在日志文件中——每次都在测试案例结束时。这种方法的问题是,如果我的程序意外崩溃,日志文件将不会生成。这是我的测试脚本示例

id = "mytest"
def scr1(control, log):
    res = False
    try:
        log.opencase(id)

        log_format = "result 1 {:s}; result 2 {:s};"
        #sample step 1
        log.log_output("step 1 output")
        #calculate var1, var2

        #sample step 2
        log.log_output("step 2 output")
        #calculate var3, var4

        log_format = "Output 1 = {:s}; Output 2 = {:s};"

        #Populate the results I need
        result1 = log_format.format (var1, var2)
        result2 = log_format.format(var3,var4)

       log.log_final(result1)
       log.log_final(result2)

       #check if result1 = result2 - if yes, set res = True

    except Exception as ex:
        log.error("Ex"+ex)
        res = False

    finally:
        if res:
            print("PASS")
        else:
            print("FAIL")
            log.log_output("Logging program output here")

        log.close_case(res)
        return res
我所有的脚本都是这种格式。在不改变脚本的情况下,是否有一种方法可以在输出可用时立即记录输出,并将其保存在日志文件中,而不是在程序崩溃时丢失它们

我的日志函数示例:

LOG_INFO = 'info'
LOG_OUTPUT = 'timestamp'
#Make an XML of type "output"
def log_output(self, txt):
    if self.Echo:
        print(txt)
        elem = et.SubElement(self.testname, LOG_OUTPUT, {LOG_TIMESTAMP: self._get_timestamp()})
        elem.txt = txt
        self.linear_log(LOG_OUTPUT + txt)

def linear_log(self, msg):
    if self.LinearLog:
        lin = open(self.LinearLog, "a")
        lin.write(self._get_timestamp() + msg)
        lin.close()

#Make an XML element
def log_final(self, str):
    if self.Echo:
        print("Final" + text)
    element = et.SubElement(self.testname,self._get_timestamp())
    element.text = str
    self.linear_log(text)
当我说崩溃——我的意思是——硬件崩溃。硬件故障。这些脚本向硬件(测试摄像机)发送命令,摄像机执行某些操作。但有时,相机中的一些模块可能会出现故障,因为它是一个测试设备。在这种情况下,我通过点击Pycharm上的红方块(end)按钮来结束脚本,因为有时候如果没有从相机获得预期的响应,脚本不会响应——我在日志文件中没有看到任何记录,因为这不是一个优雅的退出

该脚本在windows计算机上运行,并将日志存储在其中。摄像头通过串行端口连接


问题在于日志记录log.log\u final(result1)和log.log\u final(result2)。如果硬件在到达此步骤之前崩溃,即如果硬件在计算var3和var4时崩溃,则不会记录结果1和结果2的log.log_final,尽管var1和var2可用。是否有一种特定的逻辑可以应用于每次记录“可用数据”(这里是var1和var2),而不是程序等待记录所需的所有数据?

什么是
mylogger
?它是如何实施的?
close\u case
是否实际处理了输出到磁盘的刷新?实际上,您在问题中提供的
scr1
函数中似乎没有实际分配
result
,如果result:(因为未声明
result
),则
最后的
块将在
上立即崩溃,因此没有剩余语句(包括
close\u case
)我和metatoaster有很多相同的问题。根据mylogger的范围,您可以将整个过程包装在一个try/except块中,并在出现错误时关闭mylogger。我之前错过了结果分配,因为这只是一个示例代码。谢谢你指出这一点,现在补充道。。Close case处理刷新输出。澄清硬件崩溃是有用的,但不幸的是,硬件崩溃的优雅处理通常不在任何用户空间进程(即Python应用程序)的控制范围内,因为故障位于底层,假设日志写入故障设备。另一种解释是,你提到Pycharm没有响应,这通常表示某个地方有一个挂起的进程,因此它从未达到写入日志的程度,这也可能是你失败的原因。听起来你的“日志”更类似于程序的“输出”,因为产生的价值是相互依存的;对于出于诊断目的而进行的实际有用的日志记录,通常这意味着在将值生成到单独的原始日志(捕获程序完成的每个处理步骤的结果)后,立即将其写出(标准输出或磁盘)。或者,您只需将不可用值初始化为某个sentinel值(例如,
None
NotImplemented
),然后简单地记录这些值即可。