2010-08-27 73 views
3

我可以編寫一個從管道標準輸入和鍵盤讀取的python程序嗎?我可以通過管道標準輸入和鍵盤讀取程序嗎?

我的意思是?我希望能夠以這種方式使用它:

tail -f LOGFILE | myscript.py 

看到屏幕上出現的日誌行和用鍵盤鍵入命令?

這聽起來像2 stdin,這使我困惑。這是可能的還是在概念上是錯誤的?

謝謝!

回答

4

可能的解決方案是獲取用戶當前的tty並將文件流附加到對應的/ dev/tty條目。

這可能允許您在使用stdin作爲管道日誌文件時抓住鍵盤輸入。

+0

你能否給我一個代碼示例(優先Python)來理解你說的嗎? – 2010-08-27 14:06:12

+1

'kbdin = open('/ dev/tty','r')' – 2010-08-27 16:51:29

1

這可能是可以破解的,但它 在概念上是錯誤的 對我來說似乎很奇怪。 stdin是一個單輸入流。發出命令

... | program.py 

改變stdin是管前自由隨性的stdout。但接受鍵盤輸入意味着讀取原來的stdin - 你不能擁有你的蛋糕,也不能吃它!

黑客會將這兩個流合併爲一個,但這不是一個好辦法;它不能正確分離數據。如果你的程序確實應該接受鍵盤輸入以及管道數據(你確定它應該嗎?這似乎是一個非常違反直覺的事情!),正確的方法是產生單獨的線程來處理每個輸入流。

+0

你怎麼把它們分開放在第一位呢? – 2010-08-27 14:39:37

+0

@Juanjo:嗯?溪流已經「分裂」 - 它們是兩種不同的投入! – katrielalex 2010-08-27 14:48:51

+0

我在代碼中看不到它。 – 2010-08-27 15:09:52

3

使你的腳本需要一個文件參數,然後使用bash的能力,以創建一個匿名FIFO:

myscript.py <(tail -f LOGFILE) 

bash的翻譯這(大約):

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

只有命令來通過標準輸入。

<()和>(),特別是當與tee結合使用時,可以隨時使用任何想要在任意bash管道的任一側創建「分支」的地方。

相關問題