2013-05-16 52 views
0

我有一個python腳本,它可以在bash shell周圍創建一個薄包裝。它通過子進程模塊包裝bash調用,獲取輸出,並對其執行一些操作。如何在python中維護Bash輸出格式REPL

我的輸出包含換行符「\ n」,但沒有附加的顏色或空格式(即製表符)。

在Ipython中,您可以直接執行shell內置函數,比如「ls」。輸出格式(帶着色和間隔)幾乎與直接從bash shell執行「ls」命令的輸出相同。

任何想法如何Ipython模仿shell輸出格式?他們是否特別包裝不同的命令?

如果您對Ipython不熟悉,有關如何在我的python腳本的REPL中重新創建bash格式的任何想法,而無需爲不同命令創建顯式映射和邏輯?

感謝

回答

1

我可能是錯在這裏,但我不認爲IPython中確實什麼這裏。

當你輸入!ls時,這只是彈出到ls。在我的系統中,我只看到一個簡單的黑白一行一行的列表,就像我將ls重定向到一個文件,然後在該文件上完成cat一樣。即使ls在我的bash shell中被別名爲ls -FG!ls也忽略了這一點。因此,如果你得到任何花哨的格式,那是因爲你已經配置了ls(例如,通過env變量)來做一些奇特的事情。

但是,ipython和你的代碼之間可能有一點不同:我相信ipython只是讓子進程打印到它的stdout。但是,您正在捕獲該stdout並將其手動路由到您自己的輸出。這意味着bash及其所有子進程將能夠知道它們的stdout不是TTY,並可能相應地改變其輸出。因此,你不能僅僅將bash的標準輸出重定向到一個管道,你必須將它重定向到一個pty,或者其他一些會像TTY一樣行事的其他東西。

+0

是的,你是絕對正確的。我只是用subprocess.call嘗試過它,並且格式正確。愚蠢的我的一部分。謝謝! – Ben