2016-10-29 9 views
0

またはurwidなどのコンソールGUIを起動する対話型Pythonスクリプトを使用してstdoutを引き継ぎます。いくつかのアクションとループを閉じた後、どのように私はstdoutに印刷されたパスにcdすることができますか?例えば対話型のPythonアプリケーションからstdoutをcdコマンド(サブシェル?)

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') 

実行、およびurwidループを終了しqまたはQを押す:

(py27) $ python curses_script.py 

/usr/bin 

(py27) $ 

これが唯一のstdoutに印刷されたシンプルなPythonスクリプトだった場合、私は可能性がありcd $(python simple_script.py)。しかし、上記の場合、これはpythonサブシェルがstdoutをハイジャックして入力を処理するのに失敗するため、ハングします。

ファイルに書き込まずにこの問題を回避することはできますか?

+0

実用的なソリューションです。 bashスクリプトは、一時ファイルまたは名前付きパイプを作成し、このファイルのパスをコマンドライン引数としてPythonスクリプトに送り、Pythonスクリプトの終了時にファイルを読み込んで削除します。 – jme

+0

@jme私はむしろ一時ファイルの作成と後でそれを削除することに頼るのを避けるでしょう。私は以前に名前付きパイプを使ったことがなく、それらを調べます。説明する例は素晴らしいでしょう! – Kappers

+0

なぜ一時ファイルの作成を避けたいですか?このようにファイルを使用することは、Unixの考え方と一貫しています。さらに、名前付きパイプは本質的にファイルです(このサイトで使用する例がいくつかあります)。 – jme

答えて

0

の代わりにいくつかのbashの黒魔術をやって、これはかなり容易に達成することができ、これは私が前に取ったアプローチは、Pythonスクリプトを包む小さな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 
関連する問題