[英]How do you trivially change a Python script to capture everything written to stdout by itself and its subprocesses?
假設您有一個大腳本在許多地方寫入標准輸出,直接(使用 Python 功能,如print()
或logging
到stdout
)和間接通過啟動寫入標准輸出的subprocess
es。
有沒有一種簡單的方法來捕獲所有這些標准輸出?
例如,如果您希望腳本在完成時發送 email 及其所有 output。
“微不足道”是指恆定而不是線性代碼更改。 否則,我相信您將不得不在每個subrprocess
調用中引入重定向參數(和一些累積邏輯)。 您可以通過重定向sys.stdout
來捕獲腳本本身的所有 output ,但是對於所有subprocess
調用,或者實際上您可能用於啟動的任何其他類型的代碼,我都沒有看到類似的“包羅萬象”的簡單解決方案這些子流程。
有沒有這樣的解決方案,或者必須使用一個運行腳本來調用這個 Python 腳本作為子進程並從該子進程中捕獲所有stdout
?
可能最短的方法是使用os.dup2()
例如:
f = open('/tmp/OUT', 'w')
os.dup2(f.fileno(), 1)
f.close()
它的作用是替換通常是您的stdout
的文件描述符1
。 使用f
的文件描述符(然后您可以關閉)。 之后,所有寫入stdout
和/tmp/OUT
。 這種重復是可繼承的,子進程將 fd 1
寫入同一個文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.