我正试图围绕现有的ruby命令行应用程序编写一个带有节点和电子的GUI。我发现了一个示例,如何通过执行以下操作从子进程获取输出:
var spawn = require('child_process').spawn; var child = spawn('node', ['child.js']); child.stdout.on('data', function (data) { console.log('stdout: ' + data); }); child.stderr.on('data', function (data) { console.log('stderr: ' + data); });
还有孩子。js看起来像这样
while(true) { console.log('blah'); }
这对我来说很好,但如果我尝试用ruby应用程序切换到这个
var child = spawn('ruby', ['test.rb']);
这就是ruby代码
while true sleep 2 puts 'test' end
我没有得到任何输出。这似乎取决于输出。我希望看到每2秒打印一次“测试”。
Ruby不知道您需要立即获得输出,并对其进行缓冲以提高效率。如果使其刷新输出缓冲区( IO#flush ),它起作用了。
IO#flush
while true sleep 2 puts 'test' STDOUT.flush end
或者,您可以告诉Ruby您希望立即获得所有输出( IO#sync= ):
IO#sync=
STDOUT.sync = true while true sleep 2 puts 'test' end
顺便提一下,您的原始代码在JRuby上工作,因此缓冲行为不同。。。我不知道。。。