我正在用我的 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 fork
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
.