Я попробовал stdin_ub = os.fdopen(stdin.fileno(), 'rb', buffering=0), как предложено в ответе. Установка меньшего размера буфера для sys.stdin?, но программа все равно блокируется на строка ch = stdin_ub.read(1) первой попытки чтения. Он разблокируется, когда в терминал вводится return, что означает, что стандартный ввод все еще находится в строковом буфере.
Для справки, вот полный код:
Код: Выделить всё
def getpos():
stdin_ub = os.fdopen(sys.stdin.fileno(), 'rb', buffering=0)
sys.stdout.write('\033[6n')
sys.stdout.flush()
ch, k, field = None, -1, [b'', b'']
while True:
#print('reading wait...')
ch = stdin_ub.read(1)
#print('reading OK')
if ch == b'[': k = 0
elif ch == b';': k = 1
elif ch == b'R': break
elif k >= 0: field[k] += ch
try:
return tuple(map(int, field))
except:
pass
Подробнее здесь: https://stackoverflow.com/questions/377 ... n-python-3