2013-04-10 48 views
5

我有一个调用可执行文件的python脚本。可执行文件的输出会被重定向到一个日志文件以及一些关于它被调用的时间的信息。例如,使用python -V作为可执行来说明:为什么子进程标准输出到文件是乱序写入的?

import time, subprocess 
with open('./LOGFILE.txt', 'a') as F: 
    F.write('******\n') 
    F.write('Events on %s :\n'%time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) 
    EXE_output = subprocess.call(['python', '-V'], stdout=F, stderr=F) 

文件LOGFILE.txt的输出是:

Python 2.7.3 
****** 
Events on 2013-04-10 19:27:25 : 

凡我所期待的,如下所示:

****** 
Events on 2013-04-10 19:27:25 : 
Python 2.7.3 

我写的在运行子进程并将其输出和错误重定向到文件之前,打开的日志文件中包含******和时间信息。为什么要这样订购?以及如何重新订购?

+0

尝试F.flush(),然后运行子进程。 – gcbirzan 2013-04-10 16:37:48

+0

工作!你可以把它作为一个答案和一个小解释吗? – amyassin 2013-04-10 16:39:17

回答

6

您应该在运行子进程之前调用F.flush()。这是因为子进程在完成时刷新缓冲区,而不是。

+0

所以我写的是正确的顺序,但实际上子进程是在我之前把它的数据存到磁盘上的? – amyassin 2013-04-10 17:05:24

+1

从技术上说,不是,数据从用户空间缓冲区中清除,这些缓冲区是特定于进程的。内核的不是。当进程结束时,刷新它的缓冲区,所以如果你希望数据按照相同的顺序到达磁盘(最终),你需要刷新。 – gcbirzan 2013-04-10 17:17:24

+3

将数据从进程移动到操作系统是一项昂贵的操作,因此C库会缓存进程中的数据并降低写入频率。当你的子进程退出时,它的clib将数据刷新到操作系统,但你的父进程仍然在本地保存它的数据。从操作系统的角度来看,子进程首先写入。 – tdelaney 2013-04-10 17:26:51

相关问题