Python: как я могу использовать строку чтения GNU, если значение sys.stdin было изменено?

Я хочу, чтобы моя программа на Python получала ввод из канала, а затем получала ввод из терминала. После прочтения этот пост SO, Я попытался открыть /dev/tty вместо sys.stdin.

import sys
import readline

def tty_input(prompt):
    with open("/dev/tty") as terminal:
        sys.stdin = terminal
        user_input = input(prompt)
    sys.stdin = sys.__stdin__
    return user_input

Проблема с этим подходом заключается в том, что строка чтения GNU не работает, когда sys.stdin != sys.__stdin__. Я не могу использовать клавиши со стрелками для перемещения курсора или навигации по истории. Я читал о патче для этой самой проблемы, который был отправлен здесь, но я предполагаю, что ничего не вышло Это.

Если есть способ принимать ввод как из канала, так и из терминала без изменения значения sys.stdin, я открыт для предложений.


person Garrett    schedule 29.12.2016    source источник
comment
См. также этот отчет об ошибке: bugs.python.org/msg286521   -  person src    schedule 31.01.2017


Ответы (1)


Бьюсь об заклад, что sys.stdin и sys.__stdin__ не то, что вы думаете. Я бы сохранил исходный sys.stdin, прежде чем переназначать его.

import sys
import readline

def tty_input(prompt):
    oldStdin = sys.stdin
    with open("/dev/tty") as terminal:
        sys.stdin = terminal
        user_input = input(prompt)
    sys.stdin = oldStdin
    return user_input

Или сделайте копию

import sys
import readline
import copy

def tty_input(prompt):
    oldStdin = copy.copy(sys.stdin)
    with open("/dev/tty") as terminal:
        sys.stdin = terminal
        user_input = input(prompt)
    sys.stdin = oldStdin
    return user_input
person shrewmouse    schedule 15.06.2017