簡體   English   中英

為什么 python 的 subprocess.PIPE 沒有阻塞?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM