Python 如何在可用时记录结果,而不会在崩溃期间丢失?
我有一组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
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
),然后简单地记录这些值即可。