【发布时间】:2016-10-29 18:41:32
【问题描述】:
如果我要接管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 子shell 无法劫持 stdout 并处理输入。
是否可以在不写入文件的情况下解决此问题?
【问题讨论】:
-
我之前采用的方法是创建一个包装python脚本的小bash脚本。 bash 脚本创建一个临时文件或命名管道,将此文件的路径作为命令行参数提供给 python 脚本,然后在 python 脚本完成时读取并随后删除该文件。
-
@jme 我宁愿避免依赖创建临时文件并在以后删除它们。我以前从未使用过命名管道,并将研究它们。一个例子来说明会很棒!
-
为什么要避免创建临时文件?以这种方式使用文件非常符合 Unix 哲学。此外,命名管道本质上是文件(本网站上有几个使用它们的示例)。
-
@jme 我开始使用
mktemp处理临时文件,但在写入文件时遇到了麻烦(即使使用-u标志)。还不知道为什么。不幸的是,直到今天晚上我才能再试一次,但希望届时能带来一些好消息/sn-p。 -
只需写入 STDERR 或另一个文件描述符。
标签: python bash console-application python-curses urwid