2012-08-03 39 views
9

cada vez que estoy ejecutar mi script Python, que parece que se bloquea en esta línea:sys.stdin.readlines() cuelga script Python

lines = sys.stdin.readlines() 

¿Qué debo hacer para arreglar/evitar esto?

EDITAR

Aquí es lo que estoy haciendo con lines:

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

EDIT 2

estoy ejecutando este script de un gancho de modo git es allí de todos modos alrededor el EOF?

+0

Tenga en cuenta que readlines() requiere un EOF antes de que regrese. Esto no sucederá hasta que se entregue un EOF al stdin, a través de la aplicación/shell en ejecución. –

Respuesta

13

Esto depende mucho de lo que está tratando de lograr. Es posible que pueda hacer:

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

Por supuesto, con este lenguaje, así como el método readlines() que está utilizando, se necesita enviar alguna manera el carácter EOF a la secuencia de comandos para que sepa que el archivo está listo para leer. (En Unix Ctrl-D generalmente hace el truco).

+0

@JasonMock - Sí, me doy cuenta (por eso digo "para que sepa que el archivo se lee"). – mgilson

+0

Estoy ejecutando este script desde un git hook así que ¿hay alguna forma alrededor del EOF? –

+0

@BoA - Lo siento, no sé nada sobre git hooks, aunque parece que si su programa está leyendo desde una tubería, debería funcionar. – mgilson

5

A menos que esté redirigiendo algo a stdin que cabría esperar comportamiento. Eso dice que lea la entrada de stdin (que sería la consola desde la que está ejecutando el script). Está esperando tu entrada.

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

2

Si está ejecutando el programa en una sesión interactiva, a continuación, hace que esta línea de Python para leer desde la entrada estándar (es decir, su teclado) hasta que se envía el carácter EOF (Ctrl - D (Unix/Mac) o Ctrl - Z (Windows)).

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

Sé que esto no responde directamente a su pregunta, como ya se ha abordado la cuestión EOF, pero por lo general lo que he encontrado que funciona mejor cuando se lee la salida en vivo de una larga vida subproceso o de la entrada estándar es el enfoque, mientras que/si la línea:

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

En este caso, sys.stdin.readline() devolverá líneas de texto antes de se devuelve un EOF. Una vez que se da el EOF, se devolverá la línea vacía que desencadena el corte del ciclo. A colgar todavía puede ocurrir aquí, siempre que no se proporcione un EOF.

Vale la pena señalar que la capacidad de procesar la "salida en vivo", mientras que el subproceso/stdin aún se está ejecutando, requiere que la aplicación de escritura vacíe su salida.

+1

Creo que la respuesta de @ mgilson funcionaría mejor; esto funcionaría, pero es el modo más "pitónico" – pbfy0

+0

Estoy completamente de acuerdo con la afirmación de que la respuesta de @ mgilson es más pitonica. Simplemente no he encontrado que sea muy amigable para "salida en vivo", como capturar información de estado de una aplicación de larga ejecución para informar el estado al usuario, ya que requiere que el archivo como objeto produzca un EOF antes de que comience el ciclo tratamiento. En mi ejemplo, la llamada a readline() me dará líneas de texto antes de que se devuelva un EOF. Solo se requiere que el EOF rompa el tiempo, dándome una línea vacía. Dicho esto, probablemente podría mejorar mi descripción porque eso no está muy claro. –

+0

Se ejecuta línea por línea para mí en Linux ... – pbfy0

Cuestiones relacionadas