我可以編寫一個從管道標準輸入和鍵盤讀取的python程序嗎?我可以通過管道標準輸入和鍵盤讀取程序嗎?
我的意思是?我希望能夠以這種方式使用它:
tail -f LOGFILE | myscript.py
看到屏幕上出現的日誌行和用鍵盤鍵入命令?
這聽起來像2 stdin,這使我困惑。這是可能的還是在概念上是錯誤的?
謝謝!
我可以編寫一個從管道標準輸入和鍵盤讀取的python程序嗎?我可以通過管道標準輸入和鍵盤讀取程序嗎?
我的意思是?我希望能夠以這種方式使用它:
tail -f LOGFILE | myscript.py
看到屏幕上出現的日誌行和用鍵盤鍵入命令?
這聽起來像2 stdin,這使我困惑。這是可能的還是在概念上是錯誤的?
謝謝!
可能的解決方案是獲取用戶當前的tty並將文件流附加到對應的/ dev/tty條目。
這可能允許您在使用stdin作爲管道日誌文件時抓住鍵盤輸入。
這可能是可以破解的,但它
在概念上是錯誤的
對我來說似乎很奇怪。 stdin
是一個單輸入流。發出命令
... | program.py
改變stdin
是管前自由隨性的stdout
。但接受鍵盤輸入意味着讀取原來的stdin
- 你不能擁有你的蛋糕,也不能吃它!
黑客會將這兩個流合併爲一個,但這不是一個好辦法;它不能正確分離數據。如果你的程序確實應該接受鍵盤輸入以及管道數據(你確定它應該嗎?這似乎是一個非常違反直覺的事情!),正確的方法是產生單獨的線程來處理每個輸入流。
你怎麼把它們分開放在第一位呢? – 2010-08-27 14:39:37
@Juanjo:嗯?溪流已經「分裂」 - 它們是兩種不同的投入! – katrielalex 2010-08-27 14:48:51
我在代碼中看不到它。 – 2010-08-27 15:09:52
使你的腳本需要一個文件參數,然後使用bash的能力,以創建一個匿名FIFO:
myscript.py <(tail -f LOGFILE)
bash的翻譯這(大約):
mkfifo /tmp/UNIQUEFILENAME
tail -f LOGFILE > /tmp/UNIQUEFILENAME &
myscript.py /tmp/UNIQUEFILENAME
只有命令來通過標準輸入。
<()和>(),特別是當與tee結合使用時,可以隨時使用任何想要在任意bash管道的任一側創建「分支」的地方。
你能否給我一個代碼示例(優先Python)來理解你說的嗎? – 2010-08-27 14:06:12
'kbdin = open('/ dev/tty','r')' – 2010-08-27 16:51:29