2016-10-29 59 views
0

如果我通過啓動控制檯GUI的交互式Python腳本接管stdout,例如cursesurwid;經過一些動作並關閉循環後,我怎麼可能cd打印到stdout將stdout從交互式python應用程序傳遞到cd命令(subshel​​l?)

例如,

import sys 
import urwid 

def check_for_q(key): 
    if key in ('q', 'Q'): 
     raise urwid.ExitMainLoop() 

txt = urwid.Text(u"Thanks for helping") 
fill = urwid.Filler(txt, 'top') 
loop = urwid.MainLoop(fill, unhandled_input=check_for_q) 
loop.run() 

sys.stdout.write('/usr/bin') 

在運行的時候,按下qQ退出urwid循環:

(py27) $ python curses_script.py 

/usr/bin 

(py27) $ 

如果這是一個簡單的Python腳本,只印到stdout,我可以cd $(python simple_script.py)。但是,有了上述內容,這將會因爲python子shell無法劫持stdout和處理輸入而掛起。

是否可以在不寫入文件的情況下解決此問題?

+0

我已前是創建一個小bash腳本包裹Python腳本的方法。 bash腳本創建一個臨時文件或命名管道,將該文件的路徑作爲命令行參數提供給python腳本,然後在python腳本完成時讀取並隨後刪除該文件。 – jme

+0

@jme我寧願避免依賴創建臨時文件並在以後刪除它們。我以前從未使用過命名管道,並會查看它們。一個例子來說明將是太棒了! – Kappers

+0

爲什麼你想避免創建臨時文件?以這種方式使用文件與Unix哲學非常一致。此外,命名管道本質上是文件(在這個網站上有幾個使用它們的例子)。 – jme

回答

0

而不是做一些bash的黑魔法的,這可以很容易地完成,這是一個有效的解決方案

temp_file=$(mktemp /tmp/curses_script.XXXXXX) 
python curses_script.py temp_file 
# write to temp file in script... 
cd $(cat temp_file) 
rm $temp_file 
相關問題