如何杀死执行python命令的nodejs子进程,包括激活和停用venv



我是nodejs中使用子进程模块的新手,在使用python的virtualenv-libs 时遇到了问题

我在expressjs api中有一个post路由,用于激活python virtualenv,在exec((子进程上运行python并停用virtualenv。

我在项目文件夹中的一个模块中设置了这样的程序

// importing node modules
const { exec } = require("child_process");
const kill = require("tree-kill");

在控制器功能中,我试图以这种方式创建子进程

let activate_proc = exec("source pyenv/bin/activate");
let command_proc = exec("python insert.py arg1 arg2", (error, stdout, stderr) => {
// handle status/messages with http codes
});
let deactivate_proc = exec("deactivate");

我能够捕捉到这些过程的pid,并试图通过暂停10秒来使用树击杀

setTimeout(() => {
kill(command_proc.pid);
kill(activate_proc.pid);
kill(deactivate_proc.pid);
console.log("Killed all processes");
}, 10000)

这似乎是有效的,但不知何故,如果command_proc需要更多的时间,它可能会发生冲突。

有没有更有效的方法异步杀死它们?

您可以使用execSync 同步运行它们

试试这个:

// importing node modules
const {execSync } = require('child_process');

let activate_proc = execSync('source pyenv/bin/activate');
let command_proc;
let deactivate_proc;
// use try/catch for stderr
try {
command_proc = execSync('python insert.py arg1 arg2');
// stdout buffer, turn it to string
const result = command_proc.toString();
console.log('command_proc result: ', result);
// handle status/messages with http codes
// ... process command_proc
// finish
deactivate_proc = execSync('deactivate');

} catch (err) {
// handle command_proc err
console.log('output', err);
console.log('sdterr', err.stderr.toString());
}

相关内容

  • 没有找到相关文章

最新更新