2

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

问题是 CLI 必须始终能够接受来自用户的输入,并且当这些子进程产生时,stdinCLI/父进程的 似乎被阻塞,看起来 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", "&"]),但无济于事。有任何想法吗?

提前致谢!

更新:

我开始怀疑这是blessedand not的问题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
});

但是还是卡住了...

4

1 回答 1

2

您还需要分离进程:

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

是一个有用的入门。

于 2018-11-06T23:29:37.180 回答