【问题标题】:Why subprocess stdout to a file is written out of order?为什么文件的子进程标准输出被乱序写入?
【发布时间】:2013-04-02 15:06:30
【问题描述】:

我有一个调用可执行文件的 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

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

【问题讨论】:

  • 在运行子进程之前尝试 F.flush()。
  • 成功了!您可以将其发布为带有一点解释的答案吗?

标签: python subprocess redirect


【解决方案1】:

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

【讨论】:

  • 所以我写的顺序是正确的,但实际上子进程进程是在我之前把它的数据放到磁盘上?
  • 从技术上讲,不,数据已从特定于进程的用户空间缓冲区中刷新。内核不是。当进程完成时,它会刷新其缓冲区,因此如果您希望数据确保(最终)以相同的顺序到达磁盘,则需要刷新。
  • 将数据从进程移动到操作系统是一项昂贵的操作,因此 C 库在进程中缓冲数据并减少写入频率。当您的子进程退出时,其 clib 将数据刷新到操作系统,但您的父进程仍在本地保存其数据。从操作系统的角度来看,子进程先写。
猜你喜欢
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多