Python中的输出文件重定向

chm*_*ike 6 python file

我正在编写一个备份脚本,我打算每晚在cronjob中执行.

该脚本将sys.stdout和sys.stderr设置为输出文件,以记录发生的情况.

要进行备份,请使用以下代码

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
Run Code Online (Sandbox Code Playgroud)

我在子进程调用之前和之后添加了print语句.问题是我在调用之前输出任何打印指令之前得到了子进程调用的输出.我添加了flush()调用,但它没有效果.

为什么会发生这种情况,我怎么能改变这种行为?

chm*_*ike 3

我刚刚在 Stackoverflow 的答案中找到了解决方案。

代替

sys.stderr = sys.stdout = logFile = open( tmpLogFileName, 'a' )
Run Code Online (Sandbox Code Playgroud)

sys.stderr = sys.stdout = logFile = open( tmpLogFileName, 'a', 0 )
Run Code Online (Sandbox Code Playgroud)

这告诉 python 不要将任何输出缓冲区分配给文件。

  • 但这放弃得太早了!:-) 我们想帮助您弄清楚为什么flush() 不起作用;如果你只是关闭缓冲,真正的问题——无论它是什么——都不会得到解决。:-) (2认同)