簡體   English   中英

在Linux中將python腳本及其生成的進程的輸出管道傳輸到文本文件

[英]Pipe the output of a python script and its spawned processes to textfile in Linux

我有一個優化,可以在完成時輸出狀態信息。 我正在使用Python的多處理庫生成一些不同的進程來並行完成工作,但是不幸的是,它們有時會拋出一個異常,我想將其與常規狀態信息一起記錄下來。

我目前正在使用tee將主進程的輸出通過管道傳遞到文本文件,如下所示,但是其他進程的所有print語句也都不會到達此處(我理解為因為它們是不同的進程並且具有不同的std出來)。

python optimisation.py | tee output.txt & disown

如何確保所有輸出最終都在單個文本文件中? 我不在乎線條是否重疊等等。

在Linux(以及每個類似Unix的系統)中,shell始終為每個進程提供三個打開的​​文件描述符。 文件描述符的編號分別為0、1和2,並通常標記為“標准輸入”(通常簡稱為“ stdin”,盡管它最初是C庫符號,用於標識通常連接至標准輸入的緩沖I / O結構),標准輸出”(stdout)和“標准錯誤”(stderr)。 (為簡潔起見,我將使用以下簡短版本。)

默認情況下,所有這些文件描述符都將引用終端輸入和輸出。 當您使用豎線(|)語法時,Shell創建一個稱為管道的單向進程間通信機制,並將第一個命令的stdout“連接”到管道的寫端,並將第二個命令的stdin“連接”到讀取的端。管道的末端。 未提及的文件描述符將保留其默認值(即,第一個命令的stdin,第二個命令的stdout和兩個命令的stderr仍連接到終端)。

通常,Linux / Unix程序將錯誤消息和其他診斷信息寫入stderr描述符。 當沒有標准輸出重定向進行時,這似乎與標准輸出沒有區別(因為兩者都已連接到終端)。 但是,當stdout重定向到管道時,stderr不會受到影響。 它仍然連接到終端。

在您的情況下,您要將管道的讀取端連接到tee ,它將它的stdin(在這里接收您的python腳本的stdout)復制到文件和自己的stdout(在這種情況下仍然是終端)。 當您的python腳本引發異常時,python解釋器將異常信息輸出並堆棧跟蹤到其stderr。 由於您尚未重定向stderr,因此它將轉到終端。 但是,由於您還將腳本的stdout的副本發送到終端(通過tee ),因此,顯然沒有一組輸出通過tee到達終端,而有一組直接通過tee到達終端。 但是,當然,tee從來沒有看到異常信息。

因此,您還可以執行兩項簡單的操作來保存異常信息。 首先,您可以將異常信息保存到單獨的文件中:

python optimisation.py 2>error.txt | tee output.txt & disown

語法“ 2> error.txt”告訴外殼程序將文件描述符2(stderr)重定向到名為“ error.txt”的文件。

其次,如果您希望將異常信息與腳本的標准輸出一起內聯保存,請使用以下語法:

python optimisation.py |& tee output.txt & disown

“ |&”語法指定將stdout和stderr都定向到管道。 (實際上,有多種語法可以實現此目的。這是最簡短的。)

暫無
暫無

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

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