代码之家  ›  专栏  ›  技术社区  ›  chmike

python中的输出文件重定向

  •  6
  • chmike  · 技术社区  · 15 年前

    我正在写一个备份脚本,我打算每晚在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
    

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

    为什么会发生这种情况?我如何才能改变这种行为?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Community Michael Schmitz    7 年前

    我刚找到解决办法 here 在StackOverflow应答中。

    替换

    sys.stderr = sys.stdout = logFile = open( tmpLogFileName, 'a' )
    

    具有

    sys.stderr = sys.stdout = logFile = open( tmpLogFileName, 'a', 0 )
    

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

        2
  •  0
  •   Ewan Todd    15 年前

    你试过把flush调用放到try块之外吗?

        3
  •  0
  •   Ned Batchelder    15 年前

    为什么要打印到stderr?如果在向stderr写入数据时,子进程正在向stdout写入数据,那么这就可以解释奇怪的交错操作。