为什么我不能在这个exec函数中返回stdout变量?

时间:2014-02-11 10:29:11

标签: javascript node.js exec

我有一个函数来调用 node.js 服务器中的exec。我真的迷失了恢复stdout。这是功能:

function callPythonFile(args) {

    out = null
    var exec = require('child_process').exec,
    child;

    child = exec("../Prácticas/python/Taylor.py 'sin(w)' -10 10 0 10",

    function (error, stdout, stderr) {

    console.log('stderr: ' + stderr)
    if (error !== null) 
        console.log('exec error: ' + error);
    out = stdout
    })
    return out
}

当我打电话给console.log(stdout)时,我实际上得到了一个输出。但是当我尝试在函数外部打印时,它是输出,它总是为空。我真的不明白我怎么能得到它

2 个答案:

答案 0 :(得分:3)

因为在exec完成之前从函数返回并且执行了回调。

在这种情况下,Exec是异步的,遗憾的是在最后一个版本(0.10.x)中node.js中没有同步exec。

有两种方法可以做你想做的事情。

等到exec完成

var exec = require('child_process').exec,

function callPythonFile (args, callback) {
  var out = null
  exec("../Prácticas/python/Taylor.py 'sin(w)' -10 10 0 10", 
    function (error, stdout, stderr) {
      if (error !== null) 
        callback(err);
      callback(null, out);
    });
}

//then you call the function like this:

callPythonFile(args , function (err, out) {
  console.log('output is', out);
});

你会在node.js中看到很多这种模式,而不是返回你必须通过回调的东西。

返回ChildProcess对象

exec函数返回一个ChildProcess对象,它基本上是一个EventEmitter,有两个重要的属性stdoutstderr

var exec = require('child_process').exec,

function callPythonFile (args) {
  return exec("../Prácticas/python/Taylor.py 'sin(w)' -10 10 0 10");
}

//then you call the function like this:

var proc = callPythonFile(args)
proc.stdout.on('data', function (data) {
  //do something with data
});

proc.on('error', function (err) {
  //handle the error
});

有趣的是stdout和stderr是流,所以你基本上可以pipe到文件,http响应等等,并且有很多模块来处理流。这是一个http服务器,它始终调用进程并使用进程的stdout进行回复:

var http = require('http');

http.createServer(function (req, res) {

  callPythonFile(args).stdout.pipe(res);

}).listen(8080);

答案 1 :(得分:1)

点击此处了解execnodejs doc

回调函数并没有真正返回任何内容。因此,如果您想“返回”输出,为什么不直接读取流并返回结果字符串(nodejs doc)?