Python 为什么子进程的标准输出(重定向到无缓冲文件)被缓冲?

Python 为什么子进程的标准输出(重定向到无缓冲文件)被缓冲?,python,subprocess,stdout,popen,buffering,Python,Subprocess,Stdout,Popen,Buffering,从 可选的bufsize参数 指定文件所需的缓冲区 大小:0表示无缓冲,1表示线 缓冲,任何其他正值 表示使用缓冲区(大约) 那个尺寸。负bufsize表示 使用系统默认值,即 通常对tty设备进行线路缓冲 并对其他文件进行完全缓冲。如果 省略,使用系统默认值 我正在将0作为下面的bufsize传递,但没有使用flush()。当我运行main_进程时,没有写入文件的输出。 原因是什么 # --------------------------------- sub_process.py impor

可选的bufsize参数 指定文件所需的缓冲区 大小:0表示无缓冲,1表示线 缓冲,任何其他正值 表示使用缓冲区(大约) 那个尺寸。负bufsize表示 使用系统默认值,即 通常对tty设备进行线路缓冲 并对其他文件进行完全缓冲。如果 省略,使用系统默认值

我正在将0作为下面的bufsize传递,但没有使用flush()。当我运行main_进程时,没有写入文件的输出。
原因是什么

# --------------------------------- sub_process.py
import sys
import time

if __name__ == '__main__':
    print 'printed from redirect.py'
    # why is the following flush() needed? 'std-output' is (?) unbuffered...
    sys.stdout.flush() 
    time.sleep(6)


# --------------------------------- main_process.py
import subprocess
import time

if __name__ == '__main__':
    p = subprocess.Popen(
        ['python', 'sub_process.py'],
        stdout=open('std-output', 'w', 0))
    time.sleep(3)
    p.terminate()

使用带有-u标志的python,例如:

if __name__ == '__main__':
    p = subprocess.Popen(
        ['python', '-u', 'sub_process.py'],
        stdout=open('std-output', 'w'))
    time.sleep(3)
    p.terminate()

扩展Magnus Skog解决方案(+1顺便说一下:):

基本上,当子进程将派生一个新进程时,它将使用os.dup2(查看)将stdout参数复制到新的子进程stdout(fileno=1),这将保持无缓冲状态(就像dup2所做的),直到现在一切都很好,但是当python启动时(在子进程中)默认情况下,如果python没有看到-u标志,它会将stdout的缓冲区设置为line buffer(查看)。这将覆盖之前设置的缓冲标志


希望这能更多地解释你所看到的行为

这很有效,谢谢。尽管如此,我仍然想知道为什么需要它?我的猜测是,如果您使用file.write()直接写入文件,它将无缓冲地完成,但实际上您是在间接写入,因为python会在将数据发送到文件之前缓冲打印命令,因此,您需要-u标志来告诉python不要缓冲打印命令。
sys.stdout.write('printed from redirect.py')
给出与打印相同的结果-没有任何内容写入文件+1,我花了大约30分钟试图弄清楚几天前
sys.stdout
->
subprocess.PIPE
无法工作的原因
flush()
是答案,但我们为什么需要它呢???