来自http://docs.python.org/library/functions.html#open
可选的bufsize参数指定文件的所需缓冲区大小:0表示未缓冲,1表示行缓冲,任何其他正值都意味着使用(大约)该大小的缓冲区。负的bufsize意味着使用系统默认值,这通常是对tty设备进行行缓冲,而对于其他文件则完全缓冲。如果省略,则使用系统默认值。
我在下面以bufsize的形式传递0,但不使用main_process (),在运行时没有写入文件的输出。
理由是什么呢?
# --------------------------------- 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()
发布于 2011-05-07 11:53:39
扩展Magnus Skog解决方案(顺便提一句:+1 ):
基本上,当子进程将分叉一个新进程时,它将使用os.dup2 (查看subprocess.Popen._execute_child)将stdout参数复制到新的子进程stdout (fileno = 1),这将保持未缓冲的状态(就像dup2所做的那样),直到现在一切都是好的,但是默认情况下,当python将启动(在子进程中)时,如果python没有看到-u标志,它将将stdout的缓冲区设置为行缓冲区(查看main python function)。它将覆盖之前设置的缓冲标志。
希望这能解释更多你看到的行为。
发布于 2011-05-07 08:53:40
与-u标志一起使用python,例如:
if __name__ == '__main__':
p = subprocess.Popen(
['python', '-u', 'sub_process.py'],
stdout=open('std-output', 'w'))
time.sleep(3)
p.terminate()
https://stackoverflow.com/questions/5922554
复制