node.js-如何在不阻止父进程的stdin的情况下生成子进程?

时间:2018-11-06 21:00:18

标签: node.js asynchronous child-process spawn blessed

我正在节点(和blessed.js)中创建一个交互式CLI,每隔几秒钟就会生成一个子进程来运行一些Python脚本。这些脚本会修改CLI提取的一组JSON文件。

问题在于CLI必须始终能够接受用户的输入,并且在产生这些子进程时,CLI /父进程的stdin似乎被阻止,并且看起来像Python脚本在前台执行。这是我用来运行Python脚本的代码:

const { spawn } = require("child_process");

function execPythonScript(args) {
    return spawn("python3", args, { stdio: "ignore" });
}

execPythonScript(["path_to_script.py"]);

我也尝试将脚本作为后台进程(即execPythonScript(["path_to_script.py", "&"]))运行,但无济于事。有什么想法吗?

谢谢!

更新:

我开始怀疑这是blessed而不是child-process的问题,因为我已经用尽了所有相关的方法(及其参数)来生成非阻塞后台进程,并且问题仍然存在。

每个blessed实例默认情况下都使用process.stdin进行输入,但我认为stdin流有可能被子进程用尽,即使我使用它们来生成它们stdio设置为“忽略”。因此,我尝试使用ttys并实例化blessed.screen而不是/dev/tty来从活动终端(/dev/stdin)读取:

const ttys = require("ttys");

screen = blessed.screen({
    input: ttys.stdin, // Instead of process.stdin
    smartCSR: true
});

但是它仍然在阻止...

1 个答案:

答案 0 :(得分:1)

您还需要分离该过程:

spawn("python3", args, { stdio: "ignore", detached: true })

This是有用的入门书。