2016-12-29 63 views
5

Chcę, aby mój program Python pobierał dane wejściowe z potoku, a następnie pobierał dane wejściowe z terminala. Po przeczytaniu this SO post, próbowałem otworzyć/dev/tty, aby zastąpić sys.stdin.Python: Jak korzystać z readline GNU, gdy wartość sys.stdin została zmieniona?

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 

Problem z tego podejścia jest to, że GNU readline nie działa, gdy sys.stdin! = Sys .__ stdin__. Nie mogę używać klawiszy strzałek do przesuwania kursora ani nawigacji po historii. Przeczytałem łatkę dotyczącą tego problemu, który został zgłoszony here, ale domyślam się, że nic z tego nie wyszło.

Jeśli istnieje sposób akceptacji danych wejściowych z potoku i terminala bez zmiany wartości sys.stdin, jestem otwarty na sugestie.

+0

Zobacz również ten raport o błędzie: http://bugs.python.org/msg286521 – src

Odpowiedz

0

Założę się, że sys.stdin i nie są tym, za kogo się uważasz. Chciałbym zapisać oryginalny plik sys.stdin przed ponownym przypisaniem go.

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 

Albo zrobić kopię

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