2016-11-15 102 views
0

這可能是一個簡單的操作系統問題,而不是編程問題,所以我們可能需要將其遷移到另一個社區。爲什麼從我的python腳本寫入文件被覆蓋

我犯了一個錯誤,遇到了一些奇怪的行爲,我想了解發生了什麼。

在我的python腳本中,我調用了一個有人寫的java程序。他們使用Logger記錄一些消息,並且正在將java程序輸出寫入outfile。我也想將我的腳本輸出重定向到另一個文件b/c我不想從java程序中搜索消息。

out = sys.argv[2] 
... 
... 
with open(out, 'w') as outfile: 
    # call some java programs via Popen but log 
    # some msgs after all the java programs have run 
    cmd = ["java", "-cp", "blah.jar", "com.main.blah", "param1", "param2"] 
    proc = subprocess.Popen(cmd, stdout=outfile) 
    proc.wait() 
.... 
.... 
print "got here to test where this msg gets written" 

當運行我的腳本時,我意外地將stdout和stderr重定向到相同的文件名。

python script.py input output > output 2>&1 

由於這次事故,我遇到了這種奇怪的行爲。好像重定向stdout和stderr被寫入文件「輸出」的開頭而不是結尾,從而覆蓋java程序中的所有現有信息。

我只是好奇爲什麼會發生這種情況。我猜python腳本的文件指針一直向前移動,因爲java程序一直在寫日誌消息,但是操作系統重定向的文件指針沒有移動b/c,它不知道腳本正在寫什麼,因此,當重定向輪到來時,它會寫出它認爲是文件結尾的位置。它是否正確?希望有人能夠啓發我這種情況。謝謝。

P.S.我寫了命令「正確」,Java程序輸出確實去了一個文件,並重定向到另一個文件

更新: 感謝所有的意見和評論/答案。我想我沒有正確地說出我的問題,所以我可能會刪除這個問題。我不認爲這是一個重複的問題。這不是將stdout和stderr追加或寫入同一個文件的問題。我知道該怎麼做。這是一個關於試圖寫入同一文件但輸出混合起來的兩件事情的問題。我猜測發生了什麼,並把它放在我原來的帖子中,但似乎我寫的內容並不清楚。

+0

感謝所有的意見和評論/答案。我想我沒有正確地說出我的問題,所以我可能會刪除這個問題。我不認爲這是一個重複的問題。這不是將stdout和stderr追加或寫入同一個文件的問題。我知道該怎麼做。這是一個關於試圖寫入同一文件但輸出混合起來的兩件事情的問題。我猜測發生了什麼,並把它放在我原來的帖子中,但看起來好像我寫的不明確 – Classified

回答

3

在bash:

>將overrite文件

>>將附加到文件

+1

你可以用下面的方法測試它自己: 'echo「Hello,World!」 > output1 echo「Hello,World!」 > output1 cat output1' 只會顯示「Hello,World!」 'echo「Hello,World!」 >> output1 echo「Hello,World!」 >> output1 cat output1' 將顯示「Hello,World!Hello,World!」 (兩行) – mleonard87