我很难将使用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 - 文件仍为空。知道我可能做错了吗?
答案 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()
文件 - 它具有对孩子没有影响。