2012-08-03 15 views
9

Ogni volta che sto eseguendo il mio script Python, esso sembra bloccarsi su questa linea:sys.stdin.readlines() si blocca script Python

lines = sys.stdin.readlines() 

Cosa devo fare per risolvere/evitare questo?

EDIT

Ecco quello che sto facendo con lines:

lines = sys.stdin.readlines() 
updates = [line.split() for line in lines] 

EDIT 2

Io corro questo script da un gancio git quindi c'è comunque intorno l'EOF?

+0

Si noti che readlines() richiede un EOF prima che ritorni. Ciò non accadrà finché non viene assegnato un EOF allo stdin, tramite l'applicazione/shell in esecuzione. –

risposta

13

Questo dipende molto da quello che stai cercando di realizzare. Potreste essere in do grado:

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

Naturalmente, con questo idioma, così come il metodo readlines() che si sta utilizzando, è necessario inviare in qualche modo il carattere EOF allo script in modo che sappia che il file è pronto per leggere. (Su unix Ctrl-D di solito fa il trucco).

+0

@JasonMock - Sì, me ne rendo conto (è per questo che dico "in modo che sappia che il file è letto da leggere"). – mgilson

+0

Sto eseguendo questo script da un hook git quindi c'è comunque intorno all'EOF? –

+0

@BoA - Scusa, non so nulla di hook git, anche se sembra che se il tuo programma sta leggendo da una pipe, dovrebbe funzionare. – mgilson

5

A meno che non si stia reindirizzando qualcosa a stdin, il comportamento sarebbe previsto. Questo dice leggere l'input da stdin (che sarebbe la console da cui si sta eseguendo lo script). Sta aspettando il tuo input.

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

2

Se si esegue il programma in una sessione interattiva, allora questa linea fa sì che Python per leggere dallo standard input (cioè la tastiera) fino a quando si invia il carattere EOF (Ctrl - D (Unix/Mac) o Ctrl - Z (Windows)).

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

So che questo non risponde direttamente alla tua domanda, come altri hanno già affrontato la questione EOF, ma in genere quello che ho trovato che funziona meglio quando si legge l'uscita in diretta da una vissuto a lungo sottoprocesso o stdin è l'istante/se approccio line:

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

In questo caso, sys.stdin.readline() restituirà linee di testo prima un EOF viene restituito. Una volta assegnato l'EOF, verrà restituita la riga vuota che attiva l'interruzione dal ciclo. A hang può ancora verificarsi qui, purché non sia fornito un EOF.

Vale la pena notare che la possibilità di elaborare il "live output", mentre il sottoprocesso/stdin è ancora in esecuzione, richiede l'applicazione di scrittura per svuotare l'output.

+1

Penso che la risposta di @ mgilson funzionerebbe meglio; questo funzionerebbe, ma è il modo più "Pythonic" – pbfy0

+0

Sono completamente d'accordo con l'affermazione che la risposta di @ mgilson è più pitonica. Non ho trovato che sia molto amichevole per "live output", come l'acquisizione di informazioni di stato da un'applicazione lunga in esecuzione per riportare lo stato all'utente, in quanto richiede all'oggetto file come di produrre un EOF prima che il ciclo abbia inizio in lavorazione. Nel mio esempio, la chiamata a readline() mi darà linee di testo prima che venga restituito un EOF. L'EOF è solo necessario per rompere dal tempo, dandomi una linea vuota. Detto questo, probabilmente potrei migliorare la mia descrizione perché non è molto chiara. –

+0

Esegue line-by-line per me su linux ... – pbfy0