【发布时间】:2020-05-24 03:46:59
【问题描述】:
给定一个名为 interactive 的程序,它的开头如下:
% tail -f logfile | interactive
在 Python 中,我们可以通过覆盖引用将 stdin 重置为 stdin 以外的其他值:
import sys
text = sys.stdin.read()
# rebind sys.stdin to tty
sys.stdin = open("/dev/tty")
user_in = input("Selection? : ")
但是,如果我们需要继续从我们通过管道输入的文件中继续读取,这将不起作用,因为原始的 stdin 管道不会放开。有没有办法从我们的管道中获取输入并将其移动到单独的管道中,以便我们仍然可以使用stdin 来获取用户输入?
【问题讨论】:
-
我认为可以分两步完成 - 假设一个命名管道在
/tmp/my_pipe处打开,您可以将tail输出到该管道,然后独立使用 python打开并从同一管道读取 - 从而释放标准输入以供用户输入。做类似tail -f logfile > /tmp/my_pipe && python interactive.py -
也就是说,您是否考虑过尝试在单个 python 程序中完成整个事情?您实际上可以将管道/文件描述符附加到您自己的
subprocess调用中,这将简化问题,因为您不需要创建这样的代理。 -
我们的目标是让这个程序以任意方式运行;我可以将它称为
interactive -e 'tail -f logfile'并使用该命令生成一个子进程。这一切都行得通,但我真的希望能够通过管道传递给它,因为这种语法感觉更自然。好的调用 RE tail 到一个单独的管道,但你是对的,subprocess 方法要简单得多。