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
。