在Python中,可以使用subprocess.Popen
對象來實現非阻塞讀取子進程的輸出。通過設置stdout
參數為subprocess.PIPE
,可以將子進程的標準輸出重定向到管道中,然后使用select
模塊來檢查管道是否有數據可讀,從而實現非阻塞讀取。
以下是一個示例代碼:
import subprocess
import select
# 啟動子進程并將其標準輸出重定向到管道
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
# 讀取子進程輸出
while True:
# 使用select模塊檢查管道是否有數據可讀
rlist, _, _ = select.select([process.stdout], [], [], 0.1)
if process.stdout in rlist:
data = process.stdout.read(1024)
if not data:
break
print(data.decode('utf-8'))
# 等待子進程結束
process.wait()
在上面的示例中,我們啟動了一個ls -l
的子進程,并將其標準輸出重定向到管道中。然后在一個循環中使用select
模塊來檢查管道是否有數據可讀,如果有數據可讀,則讀取并打印輸出。
需要注意的是,在讀取完所有輸出后,需要調用process.wait()
來等待子進程結束。