Python中的输出文件重定向
我正在写一个备份脚本,打算每晚通过定时任务来执行它。
这个脚本会把系统的标准输出和错误输出设置到一个输出文件里,以便记录发生了什么。
为了进行备份,我使用了以下代码:
cmd = 'rsync -av --del --stats --filter "- .thumbnails/" ' + \
'--filter "- *~" --filter "- *.iso" --filter "- lost+found/" ' + \
'--filter "- .cache/" --filter "- tmp/" --filter "- *.mp3" ' + \
'--filter "- *.log" ' + srcDir + ' ' + dstDir
print "Executing '"+cmd+"' ..."
try:
sys.stdout.flush()
sys.stderr.flush()
retcode = subprocess.call( cmd, stdin = sys.stdin, stdout = sys.stdout,
stderr=sys.stderr, shell=False )
if retcode < 0:
print >>sys.stderr, "Command was terminated by signal", -retcode
elif retcode > 0:
print >>sys.stderr, "Command returned code ", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
我在调用子进程之前和之后添加了打印语句。问题是,我在调用子进程时,先看到的是子进程的输出,而不是我在调用之前的打印信息。我尝试添加了flush(),但没有效果。
为什么会这样?我该如何改变这种情况呢?
3 个回答
0
你为什么要往错误输出(stderr)里打印呢?如果子程序在往标准输出(stdout)里写东西,而你又在往错误输出里写,这可能就是为什么你看到内容混在一起的原因。
0
你有没有试过把刷新调用放在尝试块外面呢?
3
我刚在StackOverflow的一个回答中找到了这个解决办法,在这里。
把
sys.stderr = sys.stdout = logFile = open( tmpLogFileName, 'a' )
替换成
sys.stderr = sys.stdout = logFile = open( tmpLogFileName, 'a', 0 )
这样做是告诉Python不要给文件分配任何输出缓冲区。