【问题标题】:writing to file does not complete even when using python with statement即使使用带有语句的python,写入文件也不会完成
【发布时间】:2016-01-29 20:24:30
【问题描述】:

我正在使用一个简单的 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 open 将在代码块之后关闭文件,而不是在您编写的每一行之后。并使用'wb'写作

标签: python python-2.7 with-statement


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-09-19
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多