Python中的输出文件重定向

6 投票
3 回答
1782 浏览
提问于 2025-04-15 15:33

我正在写一个备份脚本,打算每晚通过定时任务来执行它。

这个脚本会把系统的标准输出和错误输出设置到一个输出文件里,以便记录发生了什么。

为了进行备份,我使用了以下代码:

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不要给文件分配任何输出缓冲区。

撰写回答