retardo de impresión con pexpect: seleccione la entrada estándar cuando no haya datos listos para leer

Usando pexpect estoy ejecutando Python en un subproceso. Cuando se ejecuta el progtwig a continuación, tengo que presionar una tecla antes de que se muestre el indicador >>> .

Anteriormente estaba usando una versión ingenua de pexpect, pero cambié la esperanza de que esto solucionara el problema. En esta versión ingenua, el problema era que select.select() devolvía la entrada estándar como lista para leer cuando en realidad no lo era, ya que se intentó una lectura de locking en la entrada estándar, bloqueando el progtwig hasta que presioné una tecla. Sospecho que lo mismo está pasando aquí.

¿Cómo puedo prevenir este comportamiento?

Este es un ejemplo tan mínimo como el que he podido encontrar hasta ahora:

 import socket import sys import threading import termios import tty import pexpect def get_cursor_position(to_terminal, from_terminal): original_stty = termios.tcgetattr(from_terminal) tty.setcbreak(from_terminal, termios.TCSANOW) try: query_cursor_position = "\x1b[6n" to_terminal.write(query_cursor_position) to_terminal.flush() while from_terminal.read(1) != 'R': pass finally: termios.tcsetattr(from_terminal, termios.TCSANOW, original_stty) def set_up_listener(): def get_cursor_on_connect(): conn, addr = sock.accept() get_cursor_position(sys.stdout, sys.stdin) conn.send(b'done') conn.close() sock = socket.socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('localhost', 1234)) sock.listen(1) t = threading.Thread(target=get_cursor_on_connect) t.start() if __name__ == '__main__': if len(sys.argv) == 2 and sys.argv[1] == 'inner': s = socket.socket() s.connect(('localhost', 1234)) assert b'done' == s.recv(1024) sys.stderr.write('>>> ') sys.stderr.flush() while True: pass # spin forever so daemon thread doesn't die else: set_up_listener() proc = pexpect.spawn(sys.executable, ['test.py', 'inner']) proc.interact()