簡體   English   中英

Python中的輸出文件重定向

[英]Output file redirection in Python

我正在編寫一個備份腳本,我打算每晚在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()調用,但它沒有效果。

為什么會發生這種情況,我怎么能改變這種行為?

我只是找到了解決辦法在這里的回答#1。

更換

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

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

這告訴python不要將任何輸出緩沖區分配給文件。

您是否嘗試將刷新調用放在try塊之外?

你為什么打印到stderr? 如果在寫入stderr時子進程正在寫入stdout,則可以解釋奇數交錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM