外部调用Python脚本并将stdout/stderr记录到文件中时,Python脚本打印输出仅出现在执行结束时

外部调用Python脚本并将stdout/stderr记录到文件中时,Python脚本打印输出仅出现在执行结束时,python,python-3.x,docker,Python,Python 3.x,Docker,我正在使用以下命令调用另一个脚本: command = 'python foo.py' with open('./logs.txt', 'w') as file: p = Popen(command, shell=True, stderr=file, stdout=file) p.wait() 其中foo.py多次调用另一个脚本bar.py 通过这样做,不幸的是,当它写入文本文件时,我得到了一个我不想要的行为。打印输出变得混乱,出于某种原因,bar.py打印输出出现在foo.p

我正在使用以下命令调用另一个脚本:

command = 'python foo.py'
with open('./logs.txt', 'w') as file:
    p = Popen(command, shell=True, stderr=file, stdout=file)
    p.wait()
其中foo.py多次调用另一个脚本bar.py

通过这样做,不幸的是,当它写入文本文件时,我得到了一个我不想要的行为。打印输出变得混乱,出于某种原因,bar.py打印输出出现在foo.py之前,这会变得混乱,因为代码遵循线性执行,我想看到的打印输出是在调用bar.py之前执行的

当我分别使用sys.stdout和sys.stderr以及Popen的stdout和stderr时,我没有看到这种行为发生

你知道为什么会这样吗

为了说明这种情况,一个精心制作的打印输出,在写入外部文件时,我将使用第三个脚本调用来更好地举例说明:

[bar.py]这是打印1 [xyz.py]这是打印1 [foo.py]这是打印1 [foo.py]这是打印2 这是第三版 在使用sys'stdout/stderr时,我实际上希望看到/它正在发生什么:

[foo.py]这是打印1 [bar.py]这是打印1 [foo.py]这是打印2 [xyz.py]这是打印1 这是第三版 对于foo.py打印输出,我只是使用Python的打印方法。我不知道外部的,因为它不是我写的

奇怪的是,这种行为也发生在docker日志上,即当我在容器上执行此链并希望看到打印输出时。所以,我认为这可能有某种联系

我该如何解决这个问题?

我想这是由于

关于堆栈交换的回答建议:

。。。当进程STDOUT被重定向到终端以外的地方时,输出被缓冲到一些操作系统特定大小的缓冲区中,在许多情况下可能是4k或8k。相反,当输出到终端时,STDOUT将被行缓冲或根本不被缓冲,因此您将在每个字符后面看到输出\n或每个字符的输出

可能会有帮助,它描述了如何禁用输出缓冲

简单的做法是告诉Python使用-u标志无缓冲地运行:


这个问题解决了!谢谢使用此功能是否有严重的副作用?如果没有缓冲,打印将在操作系统端占用更多的开销。缓冲的存在是为了减少I/O上的负载,但我怀疑这将是一个问题,除非您有很多I/O,并且时间限制非常紧。
command = 'python -u foo.py'