2016/2/2 追記 : コメントを参考に追記いたしました。
概要
こんにちは。アレクスです。
今回はですね。 Node.jsからrbファイルを実行して、
標準出力を受け取ることについて解説します。
長いこと中途半端に取り組み見て見ぬふりしていました問題が、
以外にもサクッと解決してしまいなんだか
だったのですが、
落とし穴なポイントが有りましたので、公開いたします。
今回は超初期段階です、これから複雑な実装を行いますので、
また投稿したいと思います。
最終目的
Rubyで作ったプログラムをElectronから実行して、標準出力を受け取って、
画面に表示させたいですね。プログレスバーに反映できれば great!ですね。
イメージ
Rubyで進行状況のパーセンテージ計算 => 数値をstdout
Node.jsで受け取り => GUIのプログレスバーデザイン部分のwidth
に随時反映
初期段階
まずは Node.js から外部コマンドで、簡単な Ruby コードを実行してみます。
エラーもどうなるか合わせてみてみます。
# coding: utf-8
Encoding.default_external = 'UTF-8'
begin
5.times {
print "HELLO WORLD!"
sleep(0.5)
}
raise "ERROR"
rescue => ex
print ex.class
print ex.message
print ex.backtrace
end
Node.js は以下のようにspawn
を使います。
const spawn = require('child_process').spawn;
const ls = spawn('ruby', ['hello.rb']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
参考:Child Process Node.js v5.5.0 Manual & Documentation
でもはじめは実行してもうまく行かなかったんですよね
原因
原因は2つありました。
- Ruby側の
stdout
はp
でないとダメ
puts
でもprint
でも実験したらダメでした。 - ちゃんとターミナルでしてなかったのでダメ
Sublime Text3のビルドツールでやってました。
p
以外でやった場合は、随時ではなく全て終わってから帰ってきますね。
SublimeText3のビルドツールでrunすると以下のエラーが出ました。
events.js:154
throw er; // Unhandled 'error' event
^
Error: spawn ruby ENOENT
at exports._errnoException (util.js:856:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32)
at onErrorNT (internal/child_process.js:344:16)
at nextTickCallbackWith2Args (node.js:474:9)
at process._tickCallback (node.js:388:17)
at Function.Module.runMain (module.js:449:11)
at startup (node.js:139:18)
at node.js:999:3
以上、簡単ではございましたがご紹介でした。
最後に
間違いやもっと良い方法があるよ!
という時などぜひにコメントお願い致します。
Original Post
追記
ruby側の出力バッファリングをやめることにより、puts
やprint
でも、随時出力が可能となりました。
pine613様ありがとうございました。
# coding: utf-8
Encoding.default_external = 'UTF-8'
##
# 追記部分
STDOUT.sync = true
begin
5.times {
print "HELLO WORLD!"
sleep(0.5)
}
raise "ERROR"
rescue => ex
print ex.class
print ex.message
print ex.backtrace
end