首頁 > 後端開發 > Python教學 > 為什麼從 C 程式讀取輸出時我的 Python 子程序掛起?

為什麼從 C 程式讀取輸出時我的 Python 子程序掛起?

Linda Hamilton
發布: 2024-11-19 00:57:02
原創
768 人瀏覽過

Why Does My Python Subprocess Hang When Reading Output from a C Program?

Python C 程式子進程掛在「for line in iter」

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板