2016-12-29 34 views
5

我想讓我的Python程序從管道獲取輸入,然後從終端獲取輸入。在閱讀this SO後,我試圖打開/ dev/tty來替換sys.stdin。Python:如何在sys.stdin的值發生變化時使用GNU readline?

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 

這種方法的問題是,當sys.stdin!= sys .__ stdin__時,GNU readline不起作用。我無法使用箭頭鍵移動光標或導航歷史記錄。我讀到了這個提交的here這個問題的補丁,但我猜測沒有什麼結果。

如果有一種方法可以接受來自管道和終端的輸入而不更改sys.stdin的值,我樂於接受建議。

+0

又見此錯誤報告:http://bugs.python.org/msg286521 – src

回答

0

我敢打賭sys.stdinsys.__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 
相關問題