Python:当sys.stdin的值被更改时,如何使用GNU readline?

时间:2016-12-29 04:17:41

标签: python stdin readline tty

我希望我的Python程序从管道获取输入,然后从终端获取输入。阅读this 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

这种方法的问题是当sys.stdin!= sys .__ stdin__时,GNU readline不起作用。我无法使用箭头键移动光标或导航历史记录。我读到了提交here这个问题的补丁,但我猜测没有任何问题。

如果有办法接受来自管道和终端的输入而不改变sys.stdin的值,我愿意接受建议。

1 个答案:

答案 0 :(得分: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