即使使用带有语句

时间:2016-01-29 20:24:30

标签: 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()间歇性地失败但是在日志文件中我没有找到“stuff1 complete”行,正如我所期望的那样,如果文件被正确关闭,那么在使用{{1时}}。我知道脚本失败的唯一原因是with没有我的日志工作是因为这个函数调用一个API来执行自己的日志记录,而其他日志文件告诉我2已经执行了,即使它没有完成

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

其他一些信息:

  1. 脚本是一个深夜运行的计划任务。
  2. 我从未能通过交互式运行流程来重现。
  3. 问题每2-3个晚上发生一次。
  4. 我确实看到Windows事件日志中指向dll文件,.NET Framework和0xC0000005错误的错误,这是一个内存违规。 do_stuff2()使用的API确实使用此DLL,而后者又使用.NET Framework。
  5. 显然我打算尝试解决问题本身,但此时我的问题主要集中在with(我的代码下面可能有一些层)可能会破坏其预期功能的内容中。无论with的内容是否成功执行,都要正确关闭文件。

1 个答案:

答案 0 :(得分:2)

如果存在异常,with只能关闭文件。如果扩展中存在段错误,则不会引发异常并且进程终止而不会让Python有机会关闭该文件。您可以尝试在多个位置使用f.flush()来强制Python写入文件。