首頁 > 後端開發 > Python教學 > 為什麼從 C 程式的「stdout」讀取時我的 Python「子進程」掛起?

為什麼從 C 程式的「stdout」讀取時我的 Python「子進程」掛起?

DDD
發布: 2024-11-18 05:07:02
原創
563 人瀏覽過

Why Does My Python `subprocess` Hang When Reading from a C Program's `stdout`?

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

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