我可以编写一个从管道标准输入和键盘读取的python程序吗?
我的意思?我希望能够以这种方式使用它:
tail -f LOGFILE | myscript.py
查看屏幕中显示的日志行并使用键盘输入命令?
这听起来像2 stdin,让我感到困惑。它是否可能或在概念上是错误的?
谢谢!
答案 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
- 你不能吃蛋糕而且也吃它!
黑客会将这两个流合并为一个,但这不是一个很好的方法;它没有正确分离数据。如果你的程序真的应该接受键盘输入和管道数据(你确定它应该吗?这似乎是一个非常违反直觉的想法!),正确的做法是产生单独的线程来处理每个输入流。