我可以从管道stdin和键盘上读取程序吗?

时间:2010-08-27 13:57:36

标签: python

我可以编写一个从管道标准输入和键盘读取的python程序吗?

我的意思?我希望能够以这种方式使用它:

tail -f LOGFILE | myscript.py

查看屏幕中显示的日志行并使用键盘输入命令?

这听起来像2 stdin,让我感到困惑。它是否可能或在概念上是错误的?

谢谢!

3 个答案:

答案 0 :(得分:4)

可能的解决方案是获取用户当前tty并将文件流附加到相应的/ dev / tty条目。

这可能允许您在使用stdin作为管道日志文件时获取键盘输入。

答案 1 :(得分:3)

让你的脚本获取文件参数,然后使用bash的能力创建一个匿名的fifo:

myscript.py <( tail -f LOGFILE )

bash将其翻译为(大致):

mkfifo /tmp/UNIQUEFILENAME
tail -f LOGFILE > /tmp/UNIQUEFILENAME &
myscript.py /tmp/UNIQUEFILENAME

只有命令通过标准输入。

&lt;()和&gt;(),特别是与tee结合使用时,可以在任意想要在任意bash管道的任一侧创建“分支”时使用。

答案 2 :(得分:1)

这可能是黑客攻击,但在概念上是错误的对我来说似乎很奇怪。 stdin是单个输入流。发出命令

... | program.py

stdin更改为管道前所有内容的stdout。但接受键盘输入意味着阅读原始stdin - 你不能吃蛋糕而且也吃它!

黑客会将这两个流合并为一个,但这不是一个很好的方法;它没有正确分离数据。如果你的程序真的应该接受键盘输入和管道数据(你确定它应该吗?这似乎是一个非常违反直觉的想法!),正确的做法是产生单独的线程来处理每个输入流。