ファイルにバイナリデータを書き込み、そのファイルを後続の処理で使うスクリプトを書いています(後続の処理ではどうしても実ファイルが必要になります)。
そのため、後続の処理に行く前にファイルへの出力が確実にflushされていてほしいのですが(fsync/fdatasyncまでは恐らく不要)、
Python
1with open(file_path, "wb") as f: 2 f.write(buffer) 3 f.flush() # ←これは必要?
上のコードのように組み込み関数open()
をwith文とともに使った場合、flush()
を明示的に実行しないとflushされないのでしょうか?
それとも、withブロックを抜けてcloseされるのに伴って自動的にflushも行われるのでしょうか?
現在のPythonではclose()
と記述すると内部的にflushの処理も走るので、with文による自動的なcloseでもflushしてくれるのかなと思っていたのですが、
https://seizo-igawa.hatenablog.jp/entry/2015/05/09/113405
こちらのウェブページでcodecs.open()
を使った場合は明示的にflush()
を呼ばないとうまく動作しなかったという情報があり、まさか組み込み関数のopen()
も同じなのか?と対応に困っています。
codecsのソースコードを読むぶんには内部で組み込み関数のopen()
を使っているみたいだけど、でもPythonのioのcloseの実装はflushも中で呼ぶようだし、一方で「うまく動作しなかった」という報告があるのも事実だし…と迷走中です。
とりあえず明示的にflush()
を書いておけば確実で安心ではあるのですが、「必要か不要かわからないけど書いておこう」というのもすっきりしないので、詳しい方がいらっしゃったらwith文を使った場合のflush()
の必要性について教えてください。

回答1件
あなたの回答
tips
プレビュー