2012-08-03 126 views
9

每次我執行我的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?

+0

請注意readlines()在它返回之前需要一個EOF。直到通過正在執行的應用程序/ shell爲標準輸入提供EOF之後,纔會發生這種情況。 – 2012-08-03 16:11:26

回答

13

這很大程度上取決於您要完成的工作。你也許可以做:

for line in sys.stdin: 
    #do something with line 

當然,這個習慣用法,以及你正在使用的readlines()方法,你需要將EOF字符以某種方式發送到您的腳本,以便它知道該文件已準備好讀。 (在unix上,Ctrl-D通常會這樣做)。

+0

@JasonMock - 是的,我意識到(這就是爲什麼我說「這樣​​它知道文件被讀取」)。 – mgilson 2012-08-03 16:16:10

+0

我正在從git鉤子運行這個腳本,所以反正有EOF嗎? – 2012-08-03 16:16:22

+0

@BoA - 對不起,我對git鉤子一無所知,儘管看起來如果你的程序是從管道讀取的,它應該可以工作。 – mgilson 2012-08-03 16:17:03

5

除非您將某些東西重定向到stdin那將是預期的行爲。這表示要從stdin(這將是您正在運行腳本的控制檯)讀取輸入。它正在等待您的輸入。

參見:"How to finish sys.stdin.readlines() input?

2

如果你在一個交互式會話中運行該程序,那麼該行導致Python從標準輸入讀取(即你的鍵盤),直到你發送的EOF字符(按Ctrl - D(Unix/Mac)或Ctrl - Z(Windows))。

>>> import sys 
>>> a = sys.stdin.readlines() 
Test 
Test2 
^Z 
>>> a 
['Test\n', 'Test2\n'] 
3

我知道這並不直接回答你的問題,因爲別人已經解決的問題EOF,但通常我所發現,從長期居住子或讀取標準輸入輸出現場時效果最好是while /如果線的方法:

while True: 
    line = sys.stdin.readline() 
    if not line: 
     break 
    process(line) 

在這種情況下,sys.stdin.readline()將則返回一個EOF之前返回文本線。一旦給定了EOF,空行將被返回,從而觸發循環中止。 A 掛起仍然可以在這裏發生,只要不提供EOF。

值得注意的是,當subprocess/stdin仍在運行時,處理「實時輸出」的能力需要寫入應用程序清除它的輸出。

+1

我認爲@ mgilson的答案會更好;這會起作用,但它是更「Pythonic」的方式 – pbfy0 2012-11-12 12:47:05

+0

我完全同意@ mgilson的答案更pythonic的聲明。我只是沒有發現它對於「實時輸出」非常友好,比如從長時間運行的應用程序中捕獲狀態信息以向用戶報告狀態,因爲它需要類似文件的文件在循環開始之前產生EOF處理。在我的例子中,對readline()的調用在返回EOF之前會給我一些文本。通過給我一個空行,EOF只需要打破時間。話雖如此,我可能可以改進我的描述,因爲這不是很清楚。 – 2012-11-12 15:34:45

+0

它在Linux上爲我運行... – pbfy0 2012-11-13 01:17:17