我正在使用child_process.spawn
并且需要捕获命令失败时发生的shell错误。根据{{3}},我应该可以做到:
var child_process = require('child_process');
var python = child_process.spawn(
'python', ["script.py", "someParam"]
);
python.on('error', function(error) {
console.log("Error: bad command", error);
});
当我将'python', ["script.py", "someParam"]
替换为banana
时,就像链接的问题一样,它可以正常工作,并且错误可见。但在我的情况下,使用带参数的python,永远不会调用'error'事件。
如何从python中捕获shell错误?
答案 0 :(得分:3)
根据the Node.js docs for the ChildProcess
error
event,它仅在少数情况下被解雇:
- 无法生成该过程,或
- 无法杀死该进程,或
- 无论出于何种原因,向子进程发送消息都失败了。
醇>
要捕获shell错误输出,您还可以在生成的进程的data
和stdout
上收听stderr
个事件:
python.stdout.on('data', function(data) {
console.log(data.toString());
});
python.stderr.on('data', function(data) {
console.error(data.toString());
});
要捕获shell错误代码,您可以将监听器附加到exit
事件:
python.on('exit', function(code) {
console.log("Exited with code " + code);
});
答案 1 :(得分:0)
线程有点旧,除了今天我在测试套管库上工作时遇到的所有线程。我意识到接受的答案已经有解决方案,但是对我来说,并没有明确解释。无论如何,如果有人需要,这就是您需要做的。
我意识到的是,在执行代码时,如果python解释器遇到错误,或者我应该说,如果您的代码中有错误,它将把它写入标准错误流并退出。因此,在Node.js代码中,您需要做的是监听生成的流程的stderr
流。另外,传递给print()
函数的所有数据都被写入进程的'stdout'流中。
这是示例代码:
const { spawn } = require('child_process');
const proc = spawn('python',['main.py','-c']);
proc.stderr.on('data',(data)=>{
//Here data is of type buffer
console.log(data.toString())
})
proc.stdout('data',(data)=>{
//Also buffer
console.log(data.toString());
})
如果您阅读了我的答案的第一部分,那么已经发生的事情应该已经很清楚了。您可以做的另一件事,而不是将数据写入控制台,是将其重定向到另一个流,例如,如果要将输出数据写入文件,这可能非常有用。这是您可以做到的方式:
const fs = require('fs');
const path = require('path');
const { spawn } = require('child_process');
const outputFile = path.join(__dirname,'output.txt');
const errorFile = path.join(__dirname,'output.txt');
const outputStream = fs.createWriteStream(outputFile, {
encoding: "utf8",
autoClose: true
});
const outputStream = fs.createWriteStream(errorFile, {
encoding: "utf8",
autoClose: true
});
const proc = spawn('python',['main.py','-c']);
proc.stdout.pipe(outputStream);
proc.stderr.pipe(errorStream);
这里发生的是,使用管道功能,我们将进程的stdout和stderr中的所有数据发送到文件流。另外,您不必担心文件是否存在,它将为您创建文件