[英]Why python's subprocess.PIPE is not blocking?
考慮以下代碼:
import os, select, subprocess
p1 = subprocess.Popen(["pwd"], stdout = subprocess.PIPE)
r, _, _ = select.select([p1.stdout.fileno()], [], [])
os.read(r[0], 1024)
r, _, _ = select.select([p1.stdout.fileno()], [], [])
os.read(r[0], 1024)
select
function 正確報告p1.stdout
pipe 中有數據,但第二次報告相同時,這個 pipe 沒有數據。 每個人的問題是子進程管道阻塞。 我的問題是這個 pipe 沒有阻塞。 我希望 select function 阻塞,直到 pipe 中有數據。
這是 output:
>>> import os, select, subprocess
>>> p1 = subprocess.Popen(["pwd"], stdout = subprocess.PIPE)
>>> r, _, _ = select.select([p1.stdout.fileno()], [], [])
>>> os.read(r[0], 1024)
b'/tmp\n'
>>> r, _, _ = select.select([p1.stdout.fileno()], [], [])
>>> os.read(r[0], 1024)
b''
>>>
子進程已經退出,所以關閉pipe的寫端。 當您嘗試再次讀取 pipe 時,您處於 EOF,因此返回一個空字符串。
文件對象方法的文檔解釋了這一點:
如果已到達文件末尾,
f.read()
將返回一個空字符串
select()
只有在嘗試讀取會被阻塞時才會阻塞。 當你在 EOF 時你不會阻塞,它會立即返回空字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.