我正在使用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)
然后从foo.txt
读取size
字节的数据。
wb
是完全有效的。 - Martijn Pietersos.fsync()
。 - jfs