从child_process.spawn检索shell错误输出

时间:2015-09-14 21:05:36

标签: node.js

我正在使用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错误?

2 个答案:

答案 0 :(得分:3)

根据the Node.js docs for the ChildProcess error event,它仅在少数情况下被解雇:

  
      
  1. 无法生成该过程,或
  2.   
  3. 无法杀死该进程,或
  4.   
  5. 无论出于何种原因,向子进程发送消息都失败了。
  6.   

要捕获shell错误输出,您还可以在生成的进程的datastdout上收听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中的所有数据发送到文件流。另外,您不必担心文件是否存在,它将为您创建文件