将标准输出从交互式 python 应用程序传递到 cd 命令(子 shell?)
Passing stdout from interactive python application to cd command (subshell?)
如果我接管 stdout
,使用交互式 Python 脚本启动控制台 GUI,例如 curses
或 urwid
;经过一些操作并关闭循环后,我如何 cd
到 stdout
中打印的路径?
例如,
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')
当运行时,按q
或Q
退出urwid
循环:
(py27) $ python curses_script.py
/usr/bin
(py27) $
如果这是一个只打印到 stdout
的简单 python 脚本,我可以 cd $(python simple_script.py)
。然而,使用上面的方法,这将挂起,因为 python 子外壳无法劫持 stdout
和处理输入。
是否可以在不写入文件的情况下解决这个问题?
无需使用一些 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
如果我接管 stdout
,使用交互式 Python 脚本启动控制台 GUI,例如 curses
或 urwid
;经过一些操作并关闭循环后,我如何 cd
到 stdout
中打印的路径?
例如,
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')
当运行时,按q
或Q
退出urwid
循环:
(py27) $ python curses_script.py
/usr/bin
(py27) $
如果这是一个只打印到 stdout
的简单 python 脚本,我可以 cd $(python simple_script.py)
。然而,使用上面的方法,这将挂起,因为 python 子外壳无法劫持 stdout
和处理输入。
是否可以在不写入文件的情况下解决这个问题?
无需使用一些 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