首頁  >  文章  >  後端開發  >  為什麼當使用 `for line in iter(process.stdout.readline, \'\')` 從 C 程式讀取輸出時,我的 Python `subprocess` 掛起?

為什麼當使用 `for line in iter(process.stdout.readline, \'\')` 從 C 程式讀取輸出時,我的 Python `subprocess` 掛起?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-18 05:23:02661瀏覽

Why Does My Python `subprocess` Hang When Reading Output from a C Program Using `for line in iter(process.stdout.readline, '')`?

Python 子程序因「for line in iter」而掛起

在這種情況下,Python 腳本旨在執行C 程式並接收它的輸出。然而,腳本掛在了「for line in iter(process.stdout.readline, '')」行。

緩衝問題

問題產生於緩衝問題。在 C 程式中,當輸出通過管道傳送時,stdout 通常是塊緩衝的。這表示輸出會被緩衝,直到寫入一定量或遇到換行符號為止。

在 C 程式中,while 循環的每次迭代都會列印「2000」並休眠一秒鐘。由於沒有列印換行符,因此輸出被緩衝。

For Line in Iter Issue

在 Python 中, subprocess.stdout.readline() 讀取子程序的 stdout處理並傳回一行。 “for line in iter()”迴圈迭代 readline() 傳回的行。

但是,由於 C 程式的輸出由於緩衝而沒有被刷新,因此此時沒有要讀取的行Python 腳本進入循環的位置。因此,腳本會在這一行無限期地等待。

解決方案

修正C 程式中的緩衝

  • setv :C程式可以使用setvbuf() 強制標準輸出進行行緩衝。這將確保列印後立即刷新每一行。
  • stdbuf 實用程式:stdbuf 公用程式可用於包裝C 程式並變更其緩衝

偽TTY

Pty 模組:pty 模組可用於建立一個偽 TTY,欺騙 C 程式認為它正在互動運作。在此模式下,預設輸出將採用行緩衝。 pexpect 函式庫:pexpect 函式庫提供了使用 ptys 的更高階介面。 透過應用這些解決方案之一,緩衝問題將得到解決,允許 Python 腳本按預期讀取 C 程式的輸出。

以上是為什麼當使用 `for line in iter(process.stdout.readline, \'\')` 從 C 程式讀取輸出時,我的 Python `subprocess` 掛起?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn