我正在使用如下所示的简单 python with
语句来写入日志文件。
with open(filename, 'a+') as f:
do_stuff1()
f.write('stuff1 complete. \n')
do_stuff2()
f.write('stuff2 complete. \n')
do_stuff3()
f.write('stuff3 complete. \n')
我发现我的脚本在 do_stuff2()
处间歇性失败,但是在日志文件中,我没有找到“stuff1complete”行,正如我所期望的那样,如果文件正确关闭的话应该会发生当使用 with
时。我知道脚本在 do_stuff2()
处失败而日志无法正常工作的唯一原因是,该函数调用了一个执行其自己日志记录的 API,而其他日志文件告诉我 2 已执行如果没有完成。
我的问题是 with
语句中会发生什么样的错误,不仅会停止执行,还会阻止文件正确关闭?
一些附加信息:
- 该脚本是一个在深夜运行的计划任务。
- 我从未能够通过交互运行该过程来重现。
- 此问题每 2-3 晚发生一次。
- 我确实在 Windows 事件日志中看到了指向 dll 文件、.NET Framework 的错误以及 0xC0000005 内存违规错误。 do_stuff2() 使用的 API 确实使用了该 DLL,而该 DLL 又使用了 .NET Framework。
显然,我将尝试解决问题本身,但此时我的问题集中在with
(可能是我的代码下面的一些层)内部可能发生的情况,这可能会破坏它的无论 with
的内容是否成功执行,都会正确关闭文件的预期功能。
最佳答案
with
只能在出现异常时关闭文件。如果扩展内部存在段错误,则不会引发异常,并且进程会终止,而不会给 Python 关闭文件的机会。您可以尝试在多个地方使用 f.flush()
来强制 Python 写入文件。
关于python - 即使使用 python with 语句,写入文件也无法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35093403/