【问题标题】:Python: start terminal program and parse its output while it's runningPython:启动终端程序并在运行时解析其输出
【发布时间】:2014-09-24 00:37:24
【问题描述】:

我正在为流行的 NodeJS 服务器“MeteorJS”编写 Ubuntu 的 AppIndicator,它应该列出可用的项目并可以启动服务器,当它启动服务器时,它会获取终端输出并对它们做出反应。

当你启动流星时,它会根据发生的情况给出一些输出。例如,当您更改代码时,它会输出 "changed restarting..." 或当您再次更改 "changed restarting... (2x)" 时,这很好,但是当它出现错误时,它会打印一些错误消息。

这很好,除非您的桌面上没有足够的空间来查看该终端。

所以我编写了一个应用程序,它应该以另一种方式通知我这些消息。

我的实际问题:

我需要从 python 程序启动服务器,同时我可以对服务器在其标准输出上写入的输出做出反应。

所以我想

  • 打开终端程序
  • 将其发送到后台以便我可以完成我的工作
  • 对打印的每一行做出反应

【问题讨论】:

标签: python subprocess


【解决方案1】:

您可能想研究以下函数的线程化,然后弄清楚如何使其“事件驱动”。

但这就是我在后台运行 bash 脚本并在我感兴趣时获取它们的输出的方式。

# To test it out, run the script and then turn your wifi off and on.

import subprocess


def tail():
    command = ["tail", "-f", "/var/log/wifi.log"] # your bash script execute command goes here
    popen = subprocess.Popen(command, stdout=subprocess.PIPE)
    for line in iter(popen.stdout.readline, ""):
        yield line,

logger = tail()

for line in logger:
    print line

【讨论】:

  • 这门课似乎完全没有必要。 You don't need threads "to make it "event driven""。为避免出现双换行符,请添加逗号:print line,
  • 该类不是必需的。我不太关注您链接到的演示。当我运行它时它可以工作,但我不确定如何删除与 GUI 相关的代码来替换我上面的示例。
  • 我想我也很困惑,因为这个答案说我应该使用线程来读取而不阻塞? stackoverflow.com/a/4896288/3622606
  • GUI 是如何在“事件驱动”环境中读取子进程输出的示例。 OP 为 Ubuntu 编写 AppIndicator,因此小程序可能需要类似的东西,但使用 gtk 而不是 tkinter。
  • the same question has answer that doesn't use threads。线程是以可移植方式进行非阻塞读取的简单方法。如果您知道您使用的是 POSIX (Ubuntu),那么还有更好的选择
【解决方案2】:

您可能想要一个 pty。它可以接收来自应用程序的输出,您可以从中读取并使用它做您想做的事情。

这是一个 Python 示例。它只是将所有内容记录到文件中并将其发送到终端。它基本上类似于 script(1),但带有可选的时间戳输出文件。 http://stromberg.dnsalias.org/~strombrg/pypty/

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 2018-01-11
    • 2014-02-09
    • 2013-10-07
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多