簡體   English   中英

標准輸入不應等待“ CTRL + D”

[英]stdin should not wait for “CTRL+D”

我有一個簡單的python腳本,應該從stdin中讀取。 因此,如果我將程序的標准輸出重定向到我的python腳本的標准輸入。

但是,由我的程序記錄到python腳本的東西只會在正在記錄東西的程序被殺死時才“到達” python腳本。

但是實際上我想處理程序中記錄的每一行,而不是實際運行2​​4/7的程序退出時處理。

那么我該如何實現呢? 如何使stdin在處理數據之前不等待CTRL + D或EOF?

# accept_stdin.py
import sys
import datetime

for line in sys.stdin:
    print datetime.datetime.now().second, line

# print_data.py
import time

print "1 foo"
time.sleep(3)
print "2 bar"

# bash
python print_data.py | python accept_stdin.py

像所有文件對象一樣, sys.stdin迭代器以塊的sys.stdin讀取輸入。 即使准備好輸入一行,迭代器也將嘗試在輸出任何內容之前讀取塊大小或EOF。 您可以通過使用readline方法解決此問題,該方法沒有此行為:

while True:
    line = sys.stdin.readline()
    if not line:
        # End of input
        break
    do_whatever_with(line)

您可以將其與iter的2參數形式結合使用以使用for循環:

for line in iter(sys.stdin.readline, ''):
    do_whatever_with(line)

我建議在代碼中留下注釋,以解釋為什么不使用常規迭代器。

這也是您的生產者程序的問題,即您將stdout通過管道傳送到python腳本的問題。

確實,由於該程序僅打印而從不刷新,因此它打印的數據被保存在內部程序緩沖區中以用於stdout,而不會刷新到系統中。

print_data.py print語句之后, print_data.py添加sys.stdout.flush()調用。

退出程序時會看到數據,因為程序在退出時會自動刷新。

看到這個問題的解釋,

正如@ user2357112所說,您需要使用:

for line in iter(sys.stdin.readline, ''):

之后,您需要使用-u標志啟動python,以立即刷新stdin和stdout。

python -u print_data.py | python -u accept_stdin.py

您還可以在shebang中指定標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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