Python C 程式子程序掛在「for line in iter」
當嘗試從Python 腳本執行C 程式時,使用者可能會在Python 程式碼中的「for line in iter」語句處遇到懸而未決的問題。當使用 subprocess 讀取 C 程式的輸出時會發生這種情況,在本例中是一個連續列印「2000」的測試程式。
理解問題
這種掛起行為的根本原因在於標準輸出緩衝區管理。預設情況下,C 程式產生區塊緩衝輸出,這表示資料會以大塊的形式寫入 stdout。當 stdout 重定向到管道時(如子進程的情況),這種緩衝可能會導致讀取輸出的延遲。
解決方案
1.修改C 程式緩衝:
要解決此問題,可以修改C 程式以使用行緩衝stdout。這可確保立即刷新每個新行,從而消除與緩衝區相關的延遲。
2.使用偽 TTY:
另一個解決方案是使用偽終端 (pty)。 PTY 為 C 程式提供了一個偽 tty 接口,欺騙它認為它正在交互運行。這自然會啟用標準輸出的行緩衝。
3。使用特殊實用程式:
像 stdbuf 這樣的實用程式可用於修改子程序的緩衝行為,而無需修改原始程式碼。以下 Python 程式碼示範如何使用 stdbuf:
import subprocess process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=PIPE, bufsize=1) for line in iter(process.stdout.readline, b''): print(line)
4.使用 pexpect:
Pexpect 是一個簡化 pty 處理的模組。它可以如下使用:
import pexpect child = pexpect.spawn("./main") for line in child: print(line)
透過實作這些解決方案,Python 腳本將能夠及時讀取 C 程式的輸出。這解決了「for line in iter」語句處的掛起問題。
以上是為什麼從 C 程式的「stdout」讀取時我的 Python「子進程」掛起?的詳細內容。更多資訊請關注PHP中文網其他相關文章!