【问题标题】:Electron react listen to stdout from a terminal command电子反应从终端命令收听标准输出
【发布时间】:2021-05-22 07:50:47
【问题描述】:

我正在编写一个电子应用程序,需要从命令行执行一个长时间运行的进程并实时监控输出,但我不确定如何实现这个目标。

基本上,如果终端命令打印“找到我!”然后我希望应用程序像处理某种事件一样处理它。

到目前为止,我已经能够做到:

  1. 用“spawn”从电子启动终端命令
  2. 使用“console.log”打印终端命令的输出
  3. 它似乎一直在异步打印 - 这出乎意料但很好。

tsx:以下代码将打印终端命令的输出

import { ChildProcessWithoutNullStreams } from 'child_process';

const sendOutput = (output: ChildProcessWithoutNullStreams | string) =>
{
  if (typeof output === 'string') {
      console.log(`${output}\n`);
  } else {
    output.stdout.on('data', (data) => {
      console.log(`${data.toString()}\n`);
    });
    output.stderr.on('data', (data) => {
      console.log(`${data.toString()}\n`);
    });
}
}

export function helloWorldRepeat(){

  let dir = "/Users/les/projects/github/tutorial/les-app/cpp_program";
  let cmd = "helloWorldRepeat"

  let comm = dir+ "/"+cmd;
  let params = [""];

  return {
    command: `command: ${comm} ${params}`,
    process: spawn(comm, params)
  }

export function main(){
  let c = helloWorldRepeat();
  sendOutput(c.process);
}

}

谢谢

【问题讨论】:

  • 我认为我们不需要看你的 C++ 代码,而且这个问题不应该被标记为 C++,因为它涉及 Electron 和 shell 之间的交互,而不是 C++ 和 shell 之间的交互。

标签: javascript events electron node-streams


【解决方案1】:

您应该使用child_process.spawn 运行该命令,您将监听来自stdoutstderr 的信号,它们是可读流。当信号到达时,您的应用就应该采取行动。

let subprocess = child_process.spawn(
    'command', // see note
    ['arg1', 'arg2']
)

subprocess.on('error', () => subprocess = null) // couldn't launch the process
subprocess.stdout.on('data', YOUR_EVENT_HANDLER)
subprocess.stderr.on('data', YOUR_EVENT_HANDLER)
subprocess.on('close', () => subprocess = null)

其中YOUR_EVENT_HANDLERany function suitable for the "data" event on a readable stream,我认为这意味着它接受单个字符串参数并且其返回被忽略。

您的 Electron 应用程序的其余部分希望在内容到达时(或正确的内容)得到通知,但您不希望您的 Electron 应用程序的其余部分必须了解有关子进程或可读流的任何信息。因此,您可能应该将所有这些放入一个返回 EventEmitter 实例的函数中,然后YOUR_EVENT_HANDLER 会在看到它关心的内容时触发一个干净的事件,其余时间什么都不做。


注意:对于 Node 的 PATH 上的 shell 内置命令和命令,可以只使用程序名称,但我遇到了 problems doing that in some contexts,所以我建议始终提供绝对路径到你想运行的命令。

(该链接还有一个示例显示如何将命令包装在 Promise 中,等待命令终止,然后使用所有 stdout 或 stderr 解析。)

【讨论】:

    猜你喜欢
    • 2014-10-11
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2013-09-06
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多