【问题标题】:Passing stdout from interactive python application to cd command (subshell?)将标准输出从交互式 python 应用程序传递给 cd 命令(子shell?)
【发布时间】:2016-10-29 18:41:32
【问题描述】:

如果我要接管stdout,使用交互式 Python 脚本启动控制台 GUI,例如 cursesurwid;经过一些操作并关闭循环后,我怎么能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')

运行时,按qQ 退出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


【解决方案1】:

这可以很容易地完成,而不是做一些 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2015-01-06
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多