每次我執行我的Python腳本,它似乎掛起在這條線:sys.stdin.readlines()掛起Python腳本
lines = sys.stdin.readlines()
我應該怎麼做來解決/避免這種情況?
編輯
下面是我在做什麼與lines
:
lines = sys.stdin.readlines()
updates = [line.split() for line in lines]
EDIT 2
,我從一個git的鉤子這個腳本,以便有反正周圍EOF?
每次我執行我的Python腳本,它似乎掛起在這條線:sys.stdin.readlines()掛起Python腳本
lines = sys.stdin.readlines()
我應該怎麼做來解決/避免這種情況?
編輯
下面是我在做什麼與lines
:
lines = sys.stdin.readlines()
updates = [line.split() for line in lines]
EDIT 2
,我從一個git的鉤子這個腳本,以便有反正周圍EOF?
這很大程度上取決於您要完成的工作。你也許可以做:
for line in sys.stdin:
#do something with line
當然,這個習慣用法,以及你正在使用的readlines()
方法,你需要將EOF字符以某種方式發送到您的腳本,以便它知道該文件已準備好讀。 (在unix上,Ctrl-D通常會這樣做)。
除非您將某些東西重定向到stdin
那將是預期的行爲。這表示要從stdin
(這將是您正在運行腳本的控制檯)讀取輸入。它正在等待您的輸入。
如果你在一個交互式會話中運行該程序,那麼該行導致Python從標準輸入讀取(即你的鍵盤),直到你發送的EOF字符(按Ctrl - D(Unix/Mac)或Ctrl - Z(Windows))。
>>> import sys
>>> a = sys.stdin.readlines()
Test
Test2
^Z
>>> a
['Test\n', 'Test2\n']
我知道這並不直接回答你的問題,因爲別人已經解決的問題EOF,但通常我所發現,從長期居住子或讀取標準輸入輸出現場時效果最好是while /如果線的方法:
while True:
line = sys.stdin.readline()
if not line:
break
process(line)
在這種情況下,sys.stdin.readline()將則返回一個EOF之前返回文本線。一旦給定了EOF,空行將被返回,從而觸發循環中止。 A 掛起仍然可以在這裏發生,只要不提供EOF。
值得注意的是,當subprocess/stdin仍在運行時,處理「實時輸出」的能力需要寫入應用程序清除它的輸出。
我認爲@ mgilson的答案會更好;這會起作用,但它是更「Pythonic」的方式 – pbfy0 2012-11-12 12:47:05
我完全同意@ mgilson的答案更pythonic的聲明。我只是沒有發現它對於「實時輸出」非常友好,比如從長時間運行的應用程序中捕獲狀態信息以向用戶報告狀態,因爲它需要類似文件的文件在循環開始之前產生EOF處理。在我的例子中,對readline()的調用在返回EOF之前會給我一些文本。通過給我一個空行,EOF只需要打破時間。話雖如此,我可能可以改進我的描述,因爲這不是很清楚。 – 2012-11-12 15:34:45
它在Linux上爲我運行... – pbfy0 2012-11-13 01:17:17
請注意readlines()在它返回之前需要一個EOF。直到通過正在執行的應用程序/ shell爲標準輸入提供EOF之後,纔會發生這種情況。 – 2012-08-03 16:11:26