我有一个函数来调用 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)
时,我实际上得到了一个输出。但是当我尝试在函数外部打印时,它是输出,它总是为空。我真的不明白我怎么能得到它
答案 0 :(得分:3)
因为在exec完成之前从函数返回并且执行了回调。
在这种情况下,Exec是异步的,遗憾的是在最后一个版本(0.10.x)中node.js中没有同步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中看到很多这种模式,而不是返回你必须通过回调的东西。
exec函数返回一个ChildProcess对象,它基本上是一个EventEmitter,有两个重要的属性stdout
和stderr
:
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)
点击此处了解exec
:nodejs doc。
回调函数并没有真正返回任何内容。因此,如果您想“返回”输出,为什么不直接读取流并返回结果字符串(nodejs doc)?