ファイルバッファの強制フラッシュ(Python)
ファイルの書き出し処理といっても直ちにディスクにそのファイルが書き出されるわけではない。ディスクへの書き出しが遅れうるという挙動を失念して居て、以下のコードで意図通りの動作にならず困ったことがあった。
with codecs.open('filename', 'w', 'UTF-8') as file : file.write(body) subprocess.call('cmd filename', shell=False)
「あるファイルを事前に書き出して、事前出力したファイルを入力として外部プログラムが諸々の処理をする」という単純なコードだ。しかしながら、場合によっては、subprocess.call()の時点で入力となるべきファイルが空ファイルの可能性もあり、意図通りの動作にならないのである。
ディスクへの書き出しは直ちに実行されない
ファイルの書き出し処理とはいっても、Pythonインタプリンタはデータをファイルバッファに渡したら次の処理に進んでしまう。ファイルのclose処理がされた時点でもディスク上に実体がある保証はない。ファイルの中身が依然としてバッファに格納されたままで、ディスク上は空ファイルのままのこともある。このバッファがいつ書き出されるかはインタプリンタの制御下にあり、最遅としてプロセス終了時に漸くディスクへの書き出しが始まることもある。
しかし、後続の処理がそのファイルを用いなければならないときは、ディスク上にファイルがしっかりと書き出されていないと非常に困る訣である。
flush()メソッドの登場
以下の様に一行だけ追加すれば上述の事態は避けられる。flsuh()によりバッファ上の内容は直ちにディスクに書き出されるので、後続の処理で問題が起きることはない。
with codecs.open('filename', 'w', 'UTF-8') as file : file.write(body) file.flush() subprocess.call('cmd filename', shell=False)
参考リンク
同様の事例は標準出力でも起きうるので、sys.stdout.flush()というメソッドが用意されて居る。