从管道读取STDIN时获取用户输入?

时间:2017-09-27 07:12:48

标签: python unix input pipe stdin

我正在编写一个命令行工具(让我们称之为interactive_rm ),它应该从STDIN逐行读取文件路径,以便它可以与Unix管道一起使用如下例所示:

$ find . | interactive_rm

我目前正在阅读STDIN的每条路径:

def _parse_stdin():
    for line in sys.stdin:
        yield prepare_line(line)

现在问题...在工具删除路径之前,它应该要求用户确认。为此,我会像这样使用input()

for path in _parse_stdin():
    print('Do you want to delete this path: [y/n]\n' + path)
    answer = input()
    if answer == 'y':
        delete(path)

但这不起作用,因为STDIN已经被管道占用,所以input()函数被跳过,或者我在读取一行时最终得到了一个“EOFError:EOF”

有没有人知道这方面的解决方案?

1 个答案:

答案 0 :(得分:2)

重定向stdin时,需要重新打开终端才能从中读取,例如:

from __future__ import print_function

import os

def main():
    tty = os.open("/dev/tty", os.O_RDONLY)
    while True:
        r = os.read(tty, 1024)
        if not r: # Wait for Ctrl-D.
            break
        print("----", r)

if __name__ == "__main__":
    main()

按照以下方式运行它来测试它:

python t.py < /dev/null

请注意,终端可能不可用。例如,如果命令是通过ssh会话运行而不将终端分配为ssh -T ... command