¿Cómo comunicarse con un motor de ajedrez en Python?

En Win 7 puedo comunicarme con un motor de ajedrez a través de la línea de comandos. Ejemplo de sesión pequeña con Stockfish en Win 7:

C:\run\Stockfish>stockfish-x64.exe Stockfish 2.2.2 JA SSE42 by Tord Romstad, Marco Costalba and Joona Kiiski quit C:\run\Stockfish> 

La primera línea fue emitida por el motor y el ‘quit’ fue lo que escribí para salir del motor (hay otras cosas que puedo hacer , pero eso está claro para mí).

Ahora quiero comunicarme con ese motor de python:

 import subprocess engine = subprocess.Popen( 'stockfish-x64.exe', stdin=subprocess.PIPE, stdout=subprocess.PIPE, ) for line in engine.stdout: print(line.strip()) engine.stdin.write('quit\n') 

y me dan

 C:\run\Stockfish>communicate.py b'Stockfish 2.2.2 JA SSE42 by Tord Romstad, Marco Costalba and Joona Kiiski' 

pero no abandona el motor (no aparece el indicador C: \ run \ Stockfish>), sigue esperando la entrada. Tengo que cerrar la ventana a mano. Parece que no se escribe mi mensaje de salida (última línea del script de Python) en stdin.

En otras palabras, puedo leer desde stdout pero cuando escribo en stdin no pasa nada.

¿Qué estoy haciendo mal y cómo hacerlo bien?


Edit: ok, gracias a la ayuda de larsmans lo resolví:

Ejemplo de script en Python:

 import subprocess, time engine = subprocess.Popen( 'stockfish-x64.exe', universal_newlines=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, ) def put(command): print('\nyou:\n\t'+command) engine.stdin.write(command+'\n') def get(): # using the 'isready' command (engine has to answer 'readyok') # to indicate current last line of stdout engine.stdin.write('isready\n') print('\nengine:') while True: text = engine.stdout.readline().strip() if text == 'readyok': break if text !='': print('\t'+text) get() put('uci') get() put('setoption name Hash value 128') get() put('ucinewgame') get() put('position startpos moves e2e4 e7e5 f2f4') get() put('go infinite') time.sleep(3) get() put('stop') get() put('quit') 

Salida:

 C:\run\Stockfish>1-communicate.py engine: Stockfish 2.2.2 JA SSE42 by Tord Romstad, Marco Costalba and Joona Kiiski you: uci engine: id name Stockfish 2.2.2 JA SSE42 id author Tord Romstad, Marco Costalba and Joona Kiiski option name Use Search Log type check default false option name Search Log Filename type string default SearchLog.txt ... etc ... uciok you: setoption name Hash value 128 engine: you: ucinewgame engine: you: position startpos moves e2e4 e7e5 f2f4 engine: you: go infinite engine: info depth 1 seldepth 1 score cp 56 nodes 62 nps 1675 time 37 multipv 1 pv e5f4 info depth 2 seldepth 2 score cp 48 nodes 804 nps 21157 time 38 multipv 1 pv b8c6 g1h3 info depth 3 seldepth 3 score cp 64 nodes 1409 nps 37078 time 38 multipv 1 pv b8c6 b1c3 e5f4 ... etc ... you: stop engine: bestmove e5f4 ponder g1f3 you: quit C:\run\Stockfish> 

Tienes un punto muerto: el subproceso está esperando la entrada, mientras que tu progtwig está esperando a que salga más líneas

 for line in engine.stdout: print(line.strip()) 

Este bucle solo se detiene cuando el subproceso cierra su stdout .