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

标签 python python-2.7 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() 处间歇性失败,但是在日志文件中,我没有找到“stuff1complete”行,正如我所期望的那样,如果文件正确关闭的话应该会发生当使用 with 时。我知道脚本在 do_stuff2() 处失败而日志无法正常工作的唯一原因是,该函数调用了一个执行其自己日志记录的 API,而其他日志文件告诉我 2 已执行如果没有完成。

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

一些附加信息:

  1. 该脚本是一个在深夜运行的计划任务。
  2. 我从未能够通过交互运行该过程来重现。
  3. 此问题每 2-3 晚发生一次。
  4. 我确实在 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/

相关文章:

python - pyspark 如果列具有相同的值,如何组合列值

python - 在 python 中执行 "loose coupling"的正确方法是什么?

javascript - 在 javascript 中使用 with 是不好的做法吗?

python - 在 Python 'with' 语句中重用多个上下文

python - 使用另一个索引数组进行 Numpy 数组运算

Python raise 有两个参数

python - 了解 super 的工作原理

python - 为什么 with 语句中变量是可选的?

python - 过滤图像以提高文本识别

Python Scapy nfqueue