我有一個使用子進程調用另一個腳本的腳本(Python)。父腳本同時寫入控制檯和日誌文件(我使用this question的接受答案中的代碼拆分輸出),但子進程的打印語句只是stdout,而不是日誌文件。同時寫入子進程和父進程的文件
我知道這是爲什麼:子進程有stdout設置爲正常的標準輸出,而不是父進程具有的特殊tee對象。我嘗試將tee對象作爲參數傳遞給子進程,但我學會了難以將對象作爲參數傳遞給子進程的難題。我的備份計劃是傳遞要寫入的文件的路徑字符串,然後讓子進程使用同一個文件創建自己的TEE對象。
我的問題是,如果兩個進程都在同一時間寫入同一個文件,輸出是否會混亂?我在父進程中使用open(「file」,'w'),並且這首先被調用,並且在子進程中使用open(「file」,'a')。假設文件應該以正確的順序包含打印語句的輸出,因爲向文件添加'a'意味着這些行總是被添加到當前文件的結尾,不是嗎?還是有規則打開一個文件,防止它被同時打開的兩個進程?
POST_TEST:做一些測試自己以後,我發現: - 您才能打開(「文件」,「W」)連續 多次 - 你才能打開(「文件」, 'w'),然後打開(「file」,'a') - 在第一種情況下,子進程完全覆蓋文件。 - 在第二種情況下,順序不正確,某些輸出似乎丟失。
我的新問題是,我應該用什麼替代解決方案同時從父進程和子進程寫入文件,而不會導致順序錯亂或重疊?
Google「互斥體」。互斥鎖是資源上的MUTually EXCLUSIVE鎖,可避免兩個進程使用相同資源時發生衝突。 –
http://stackoverflow.com/questions/489861/locking-a-file-in-python –
以「a」模式打開的進程將始終寫入文件末尾。但是以'w'模式打開的那個不會。您需要以'a'模式打開它們。 – Barmar