subprocess.Popen不重定向生成进程的输出

时间:2015-02-22 04:09:48

标签: python subprocess popen

我很难将使用subprocess.Popen创建的进程的输出重定向到我选择的文件。以下是我正在做的事情:

#popen_test.py 
import sys, os, subprocess, time, signal

process_log = open('process.log','w')
process = subprocess.Popen([<path_to_python_binary>,"process.py"], stdout=process_log, stderr=process_log, preexec_fn=os.setsid) #launching the sub process
time.sleep(10) #waiting for sometime; this allows the sub process to print some statements. See below
process_log.flush()
os.killpg(process.pid,signal.SIGTERM)
process_log.close()

而且,这就是我的process.py看起来的样子。它基本上是定期在stdout上打印一些语句:

#process.py    
import sys,os,time
print "Initially..."
while True:
    print "Hello World"
    time.sleep(1)

我正在使用ps看到正在启动的进程,但输出不会进入process.log - 文件仍为空。知道我可能做错了吗?

1 个答案:

答案 0 :(得分:3)

看起来像"block-buffering mode" -related issue。在print "hello world"之后使用python -u or add sys.stdout.flush()运行脚本。

默认情况下,

sys.stdout在重定向到文件时完全缓冲。 print "hello world"将字符串添加到stdout缓冲区。如果你杀死了子进程,则不会刷新缓冲区,因此如果缓冲区在进程仍在运行时没有溢出(缓冲区大小为4K-8K:os.fstat(sys.stdout.fileno()).st_blksize),则不会向文件写入任何内容。

注意:子进程使用文件描述符的副本,即,process_log返回后,您可以在父中关闭Popen()文件 - 它具有对孩子没有影响