即使使用 python with 语句也无法完成写入文件

writing to file does not complete even when using python with statement

我正在使用一个简单的 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() 处间歇性失败但是在日志文件中我没有找到行 "stuff1 complete" 正如我所期望的那样如果文件正确关闭了使用时应该发生with。我知道脚本在 do_stuff2() 失败而我的日志不工作的唯一原因是因为这个函数调用了一个 API 它自己进行日志记录并且另一个日志文件告诉我即使 2 已经执行它没有完成。

我的问题是 with 语句中会发生什么样的错误,不仅会停止执行,还会阻止文件正确关闭?

一些附加信息:

  1. 脚本是深夜运行的定时任务。
  2. 我从未能够通过 运行 交互地重现该过程。
  3. 每2-3晚出现一次问题。
  4. 我确实在 Windows 事件日志中看到错误指向一个 dll 文件、.NET Framework 和一个 0xC0000005 错误,这是一个内存冲突。 do_stuff2() 使用的 API 确实使用了此 DLL,后者又使用 .NET Framework。

显然我会尝试自己解决问题,但此时我的问题集中在 with 内部可能发生的事情(可能在我的代码下面的一些层)可能会破坏其预期无论with的内容是否执行成功,都能正确关闭文件的功能。

with只有出现异常才能关闭文件。如果扩展中存在段错误,则不会引发异常并且进程会在不给 Python 关闭文件的机会的情况下终止。您可以尝试在几个地方使用 f.flush() 来强制 Python 写入文件。