」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在 Python 中同時將子進程輸出重新導向到檔案和終端機?

如何在 Python 中同時將子進程輸出重新導向到檔案和終端機?

發佈於2024-11-08
瀏覽:932

How to Redirect Child Process Output to Files and Terminal Simultaneously in Python?

如何在Python中將子程序的結果同時輸出到文件和終端

當使用subprocess.call()時,可以指定檔案描述符作為outf 和errf 將stdout 和stderr 重定向到特定檔案。但是,這些結果不會同時顯示在終端機中。

使用Popen 和線程的解決方案:

為了克服這個問題,我們可以直接利用Popen 並利用stdout=PIPE 從子程序的stdout 讀取的參數。具體方法如下:

import subprocess
from threading import Thread

def tee(infile, *files):
    # Forward output from `infile` to `files` in a separate thread
    def fanout(infile, *files):
        for line in iter(infile.readline, ""):
            for f in files:
                f.write(line)

    t = Thread(target=fanout, args=(infile,)   files)
    t.daemon = True
    t.start()
    return t

def teed_call(cmd_args, **kwargs):
    # Override `stdout` and `stderr` arguments with PIPE to capture standard outputs
    stdout, stderr = [kwargs.pop(s, None) for s in ["stdout", "stderr"]]
    p = subprocess.Popen(
        cmd_args,
        stdout=subprocess.PIPE if stdout is not None else None,
        stderr=subprocess.PIPE if stderr is not None else None,
        **kwargs
    )
    
    # Create threads to simultaneously write to files and terminal
    threads = []
    if stdout is not None:
        threads.append(tee(p.stdout, stdout, sys.stdout))
    if stderr is not None:
        threads.append(tee(p.stderr, stderr, sys.stderr))
        
    # Join the threads to ensure IO completion before proceeding
    for t in threads:
        t.join()

    return p.wait()

使用此函數,我們可以執行子程序並將其輸出同時寫入檔案和終端:

outf, errf = open("out.txt", "wb"), open("err.txt", "wb")
teed_call(["cat", __file__], stdout=None, stderr=errf)
teed_call(["echo", "abc"], stdout=outf, stderr=errf, bufsize=0)
teed_call(["gcc", "a b"], close_fds=True, stdout=outf, stderr=errf)
最新教學 更多>
  • 令人興奮的體育週:亮點和亮點
    令人興奮的體育週:亮點和亮點
    過去的一周對於全球最新體育評論愛好者來說是一段令人興奮的旅程。從破紀錄的表演到扣人心弦的結局,這裡匯總了體育界最激動人心的賽事。 足球:英超聯賽令人震驚 英超震撼人心 英超聯賽總是充滿戲劇性,本周也不例外。曼城在一場萬眾矚目的比賽中迎戰利物浦隊,最終令人驚訝地3-3戰平。兩支球隊都...
    程式設計 發佈於2024-11-08
  • 網站所有者如何防止第三方 Iframe 嵌入?
    網站所有者如何防止第三方 Iframe 嵌入?
    防止第三方 iframe 嵌入網站所有者經常面臨其頁面嵌入第三方框架 (iframe) 的問題網站。雖然引用請求標頭在頁面載入期間檢測這種情況時被證明無效,但有多種方法可以解決此問題。 JavaScript 檢測頁面載入後,JavaScript可以用來偵測它是否正在框架內顯示。透過比較 top 和 ...
    程式設計 發佈於2024-11-08
  • 如何使用 NumPy 的「np.newaxis」在陣列操作中啟用廣播?
    如何使用 NumPy 的「np.newaxis」在陣列操作中啟用廣播?
    NumPy 的'np.newaxis' 是什麼以及如何使用它理解'np.newaxis'NumPy 的“np.newaxis”,也稱為“None”,是一個偽索引,用於臨時向數組添加軸。使用一次時,它將數組的維度增加一。例如,1D 數組變成 2D 數組,2D 數組變成 ...
    程式設計 發佈於2024-11-08
  • React原始碼中MessageChannel的使用
    React原始碼中MessageChannel的使用
    這篇文章我們分析React原始碼中MessageChannel的用法。 我們先來了解什麼是MessageChannel。 訊息頻道 Channel Messaging API 的 MessageChannel 介面允許我們建立一個新的訊息通道並透過它的兩個 MessagePort...
    程式設計 發佈於2024-11-08
  • MySQL 如何處理較短列中的長整數:溢位或截斷?
    MySQL 如何處理較短列中的長整數:溢位或截斷?
    較短列的長整數轉換:機制與公式將長整數插入較短整數列時,MySQL 通常會截斷該值以適合指定的長度。但是,在某些情況下,行為可能會有所不同,從而導致意外的轉換。 考慮一個 10 位長整數列 some_number。如果將超過最大整數範圍 (2147483647) 的值插入到此列中,MySQL 會將該...
    程式設計 發佈於2024-11-08
  • 如何在教義 2 中建立額外欄位的多對多連結表?
    如何在教義 2 中建立額外欄位的多對多連結表?
    Doctrine 2 和額外欄位的多對多連結表本文解決了在Dotrine 2 中建立多對多關係的問題,其中連結表包含一個附加價值,特別是在庫存系統的上下文中。 原則 2 中的多對多關係可以使用不包含任何附加欄位的連結表來建立。但是,當每個連結都需要額外的值時,必須將連結表重新定義為新實體。 提供的程...
    程式設計 發佈於2024-11-08
  • JavaScript 中的單管道運算子如何處理浮點數和整數?
    JavaScript 中的單管道運算子如何處理浮點數和整數?
    探索JavaScript 中單管道運算子的位元性質在JavaScript 中,單一管道運算子(「|」)執行按位運算稱為位元或的運算。理解此操作對於理解其對不同輸入值的影響至關重要,如下例所示:console.log(0.5 | 0); // 0 console.log(-1 | 0); // -1...
    程式設計 發佈於2024-11-08
  • 列表理解和Regae
    列表理解和Regae
    啊。我一直害怕的那一刻。 第一篇文章,包含我自己的想法、觀點和可能的知識細分。 請注意,親愛的讀者,這並不是對 Python 單行 for 循環、追加到列表和返回一些數據的能力的深入探討或令人難以置信的分解。不,不。這只是展示瞭如何有趣——以及如何愚蠢——小東西可以組合在一起,讓...
    程式設計 發佈於2024-11-08
  • 如何解決 WAMP 上由於缺少 Openssl 擴充功能而導致的 Composer 錯誤?
    如何解決 WAMP 上由於缺少 Openssl 擴充功能而導致的 Composer 錯誤?
    Composer 有問題? WAMP 上缺少Openssl 擴充功能嘗試將Composer 合併到WAMP 設定中時,您可能會遇到警告:「The openssl 擴充功能遺失。」此訊息表明,如果沒有此擴充程序,您的系統的安全性和穩定性將會受到影響。 故障排除步驟:您已經認真瀏覽了 WAMP 介面,標...
    程式設計 發佈於2024-11-08
  • 如何解決 Windows 上 PHP 中的 SSL 套接字傳輸問題?
    如何解決 Windows 上 PHP 中的 SSL 套接字傳輸問題?
    解決PHP 中的SSL Socket 傳輸問題在Windows 系統上使用PHP 時,開發人員可能會遇到錯誤「無法連線到ssl: //...”由於啟用“ssl”套接字傳輸存在困難。本文將指導您排除故障並解決此問題,並介紹您迄今為止已採取的具體步驟。 故障排除步驟檢查PHP 設定:確保php_open...
    程式設計 發佈於2024-11-08
  • 為什麼類比滑鼠懸停在 Chrome 中不會觸發 CSS 懸停?
    為什麼類比滑鼠懸停在 Chrome 中不會觸發 CSS 懸停?
    在JavaScript 中模擬滑鼠懸停:澄清差異並實現手動控制嘗試在Chrome 中模擬滑鼠懸停事件時,您可能遇到了一個有趣的問題問題。儘管“mouseover”事件監聽器已成功激活,但相應的CSS“hover”聲明並未生效。此外,嘗試在滑鼠懸停偵聽器中使用 classList.add("...
    程式設計 發佈於2024-11-08
  • 你能衡量 MySQL 索引的有效性嗎?
    你能衡量 MySQL 索引的有效性嗎?
    了解 MySQL 索引效能優化 MySQL 查詢對於高效的資料庫處理至關重要。索引是提高搜尋效能的關鍵技術,但監控其有效性也同樣重要。本文解決了是否可以評估 MySQL 索引效能的問題並提供了解決方案。 識別查詢效能決定查詢是否使用索引,執行下列查詢:EXPLAIN EXTENDED SELECT ...
    程式設計 發佈於2024-11-08
  • 如何自訂 PDF.js
    如何自訂 PDF.js
    PDF.js 是一個很棒的開源項目,它經常更新並且不斷添加新功能,但是從外觀上看它很醜陋,或者可以說它看起來已經過時了。從 PDF.js 取得最新的 PDF 功能和修復,但在演示方面擁有流暢的外觀怎麼樣? PdfJsKit 的pdf 檢視器並不引人注目,它不會直接更改PDF.js 的程式碼,它只是...
    程式設計 發佈於2024-11-08
  • 即將推出大事
    即將推出大事
    我決定從頭開始建立全端 Web 開發人員課程,從 HID 一直到伺服器和可擴展性。所有需要知道的,都將免費涵蓋免費! 以下是涵蓋的內容: 網際網路 互聯網是如何運作的? 什麼是HTTP? 瀏覽器及其運作方式? DNS 及其運作方式? 什麼是網域名稱? 什麼是託管? ...
    程式設計 發佈於2024-11-08
  • HTML 頁面的剖析
    HTML 頁面的剖析
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3