Select在无需读取时返回stdin,因此在Python中使用pty延迟打印

Select在无需读取时返回stdin,因此在Python中使用pty延迟打印,python,select,stdin,pty,Python,Select,Stdin,Pty,在OSX上使用Python2.7.9运行此脚本后,直到我按下一个键,才会显示提示>>>。我相信这是因为select-in-pty将stdin返回为read-to-read,而其上没有要读取的字节 此脚本在一个线程中侦听套接字,在另一个线程中在pty的子进程中运行脚本的客户端版本。此客户端版本连接到服务器,使其执行游标查询,然后接收套接字上的字节并关闭连接。然后,客户端进程打印一个提示并等待输入,但由于父进程的tty代码正在等待stdin的阻塞读取,因此直到按下一个键,此提示才会出现在屏幕上 问题

在OSX上使用Python2.7.9运行此脚本后,直到我按下一个键,才会显示提示>>>。我相信这是因为select-in-pty将stdin返回为read-to-read,而其上没有要读取的字节

此脚本在一个线程中侦听套接字,在另一个线程中在pty的子进程中运行脚本的客户端版本。此客户端版本连接到服务器,使其执行游标查询,然后接收套接字上的字节并关闭连接。然后,客户端进程打印一个提示并等待输入,但由于父进程的tty代码正在等待stdin的阻塞读取,因此直到按下一个键,此提示才会出现在屏幕上

问题与此直接相关–不同之处在于我没有使用pexpect,只是使用标准库中的pty来简化示例

import pty
import socket
import sys
import termios
import threading
import tty


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
    else:
        set_up_listener()
        pty.spawn([sys.executable, 'test.py', 'inner'])

您在什么位置运行它,从什么python版本运行它?您描述的行为发生在它试图自己生成客户机时。否则,如果你分别启动客户端和服务器,事情就会顺利进行。Pynchia,是的,这是正确的-我只在服务器在pty中运行客户端时观察到这种行为。我已经添加了脚本功能的描述。