Node.js将数据从terminal命令传输到客户端

关于node.js执行命令和输出数据已经有几个问题了,但是我仍然无法得到这个工作。 我想要的是,使用node.js我想执行一个长时间运行的python脚本,并产生一些中间输出。 我希望一旦生成这些输出到客户端。 我已经尝试了以下,但我得到的是,只有命令完成后,我才得到整个输出。 我怎样才能实时传递数据到套接字? 谢谢。

function run_cmd(cmd, args) { var spawn = require('child_process').spawn, child = spawn(cmd, args); return child; } io.sockets.on('connection', function (socket) { var foo = new run_cmd('python', ['test.py']); foo.stdout.setEncoding('utf-8'); foo.stdout.on('data', function(data) { console.log('sending data'); io.sockets.emit('terminal', {output: data});; }); ); 

所有的node.js代码都可以。你的代码只发送一次数据,因为你的代码只能获取一次数据。

问题是put或者print命令不足以触发foo.stdout.on尝试在你想用ruby代码发送块的时候添加'$ stdout.flush'。 您需要明确订购输出数据。

这里是我的testing代码。

JS

 var spawn = require('child_process').spawn; var cmd = spawn('ruby', ['testRuby.rb']); var counter = 0; cmd.stdout.on('data', function(data) { counter ++; console.log('stdout: ' + data); }); cmd.stderr.on('data', function(data) { console.log('stderr: ' + data); }); cmd.on('exit', function(code) { console.log('exit code: ' + code); console.log(counter); }); 

testRuby.rb

 def execute_each_sec(sleep_sec) yield sleep sleep_sec end 5.times do execute_each_sec(1) do || puts "CurrentTime:#{Time.now}" $stdout.flush end end 

正如你所看到的,我正在调用$ stdout.flush来显式地在testRuby.rb中输出数据。 如果我删除它,node.js将不会得到任何东西,直到testRuby.rb完成执行。

编辑哈哈我的坏。 我用ruby代替python。 在python的情况下,使用sys.stdout.flush()像svkk说

编辑:在Python中,你也可以使用-u标志强制它在每次打印后刷新。