在Python 中使用子進程運行C 程式在讀取輸出時可能會很棘手C程式.在這種情況下,Python 腳本凍結在「for line in iter(process.stdout.readline, '')」。
這裡的問題是緩衝。預設情況下,C 程式在寫入管道時對其標準輸出使用區塊緩衝(就像從 Python 運行程式時的情況一樣)。這意味著在緩衝區已滿或程序終止之前,資料不會刷新。
有多種方法可以解決此問題:
1.修改C程式:
新增setvbuf( stdout, (char *) NULL, _IOLBF, 0);在C 程式的開頭強制進行行緩衝。這將在每個換行符後刷新緩衝區。
2.使用stdbuf工具:
透過stdbuf工具重新導向C程式的stdout來控制緩衝行為。例如:
import subprocess process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=subprocess.PIPE, bufsize=1) for line in iter(process.stdout.readline, ''): print(line)
3。使用偽 TTY:
使用偽 TTY 來模擬 C 程式的互動終端環境。這將強製程式使用行緩衝。
import pexpect child = pexpect.spawn("./main") for line in child: print(line)
4.從兩端讀取:
使用 Python 中的 select 函數同時從 C 程式的 stdout 和 Python 腳本的 stdin 讀取。即使 C 程式沒有產生任何輸出,這也會解除 Python 腳本的阻塞。
以上是為什麼從 C 程式讀取輸出時我的 Python 子程序掛起?的詳細內容。更多資訊請關注PHP中文網其他相關文章!