Как использовать объект StringIO () в качестве стандартного ввода программы для отправки строки в оператор ввода, - PullRequest
0 голосов
/ 29 апреля 2020

Я хотел бы иметь возможность перенаправить стандартный вывод моей программы на объект StringIO (), чтобы я мог имитировать реакцию пользователя на оператор ввода.

newstdin = StringIO()
sys.stdin = newstdin
newstdin.write("hey")
newstdin.seek(0)

response = input()
print(response)

Мой код работает, когда ответ уже однако в объекте StringIO (), если ничего нет, он немедленно вызывает ошибку EOF вместо ожидания ответа, как если бы он был установлен в обычный sys.stdin. Как я могу сделать это так, чтобы оператор input () ждал, когда ответ будет записан в объект StringIO () (это будет сделано в отдельном потоке). Спасибо!

1 Ответ

0 голосов
/ 06 мая 2020

Если кому-то интересно, я решил сделать это следующим образом:

accinput = input

def input(prompt=None):
    if prompt:
        print(prompt)
    while True:
        try:
            return accinput()
        except EOFError:
            pass

Вы можете сохранить реальную функциональность ввода в accinput переопределенном вводе, чтобы непрерывно повторять попытку чтения ввода от stdin stringIO () до тех пор, пока он не встретит EOFError.

...