即使使用 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
语句中会发生什么样的错误,不仅会停止执行,还会阻止文件正确关闭?
一些附加信息:
- 脚本是深夜运行的定时任务。
- 我从未能够通过 运行 交互地重现该过程。
- 每2-3晚出现一次问题。
- 我确实在 Windows 事件日志中看到错误指向一个 dll 文件、.NET Framework 和一个 0xC0000005 错误,这是一个内存冲突。 do_stuff2() 使用的 API 确实使用了此 DLL,后者又使用 .NET Framework。
显然我会尝试自己解决问题,但此时我的问题集中在 with
内部可能发生的事情(可能在我的代码下面的一些层)可能会破坏其预期无论with
的内容是否执行成功,都能正确关闭文件的功能。
with
只有出现异常才能关闭文件。如果扩展中存在段错误,则不会引发异常并且进程会在不给 Python 关闭文件的机会的情况下终止。您可以尝试在几个地方使用 f.flush()
来强制 Python 写入文件。
我正在使用一个简单的 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
语句中会发生什么样的错误,不仅会停止执行,还会阻止文件正确关闭?
一些附加信息:
- 脚本是深夜运行的定时任务。
- 我从未能够通过 运行 交互地重现该过程。
- 每2-3晚出现一次问题。
- 我确实在 Windows 事件日志中看到错误指向一个 dll 文件、.NET Framework 和一个 0xC0000005 错误,这是一个内存冲突。 do_stuff2() 使用的 API 确实使用了此 DLL,后者又使用 .NET Framework。
显然我会尝试自己解决问题,但此时我的问题集中在 with
内部可能发生的事情(可能在我的代码下面的一些层)可能会破坏其预期无论with
的内容是否执行成功,都能正确关闭文件的功能。
with
只有出现异常才能关闭文件。如果扩展中存在段错误,则不会引发异常并且进程会在不给 Python 关闭文件的机会的情况下终止。您可以尝试在几个地方使用 f.flush()
来强制 Python 写入文件。