Pythonスクリプトで大きなファイルを作成しています(1GB実際には8つ以上あります)。それらを作成した直後に、それらのファイルを使用するプロセスを作成する必要があります。
スクリプトは次のようになります。
# This is more complex function, but it basically does this:
def use_file():
subprocess.call(['C:\\use_file', 'C:\\foo.txt']);
f = open( 'C:\\foo.txt', 'wb')
for i in 10000:
f.write( one_MB_chunk)
f.flush()
os.fsync( f.fileno())
f.close()
time.sleep(5) # With this line added it just works fine
t = threading.Thread( target=use_file)
t.start()
しかし、アプリケーションは空use_fileのように振る舞います。foo.txtいくつかの奇妙なことが起こっています:
- コンソールで実行する
C:\use_file C:\foo.txtと(スクリプトが終了した後)、正しい結果が得られます - 別の python コンソールで手動
use_file()で実行すると、正しい結果が得られます C:\foo.txtが呼び出された直後にディスクに表示されますが、スクリプトが終了するまでopen()サイズは維持されます0B- 追加する
time.sleep(5)と、期待どおりに(または必要に応じて)動作し始めます
私はすでに見つけました:
os.fsync()しかし、うまくいかないようです(からの結果は空use_fileであるかのようです)C:\foo.txt- (ファイルを開くとき)の使用
buffering=(1<<20)も機能しないようです
私はますますこの行動に興味があります。
質問:
- Pythonは操作をバックグラウンドにフォークしますか?
close()これはどこに文書化されていますか? - これを回避するにはどうすればよいですか?
- 何か不足していますか?
- 追加した後
sleep:それはwindows/pythonのバグですか?
注: (反対側に何か問題がある場合) アプリケーションuse_dataは次を使用します。
handle = CreateFile("foo.txt", GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
size = GetFileSize(handle, NULL)
そして、sizeからのバイトを処理しますfoo.txt。