Node.js REPL と対話する Ruby スクリプトを作成しようとしています。私がする時:
i = IO.popen('node', 'r+')
i.write("console.log('hi')")
write 呼び出しは、書き込みのサイズを返します。しかし、処理のために REPL の出力を取得するにはどうすればよいでしょうか? #read を試しましたが、出力が返されません。
Node.js REPL と対話する Ruby スクリプトを作成しようとしています。私がする時:
i = IO.popen('node', 'r+')
i.write("console.log('hi')")
write 呼び出しは、書き込みのサイズを返します。しかし、処理のために REPL の出力を取得するにはどうすればよいでしょうか? #read を試しましたが、出力が返されません。
にパイプするとnode
、標準入力からスクリプト全体を読み取ることが期待されます。上記のコードを機能させるには、出力を読み取る前に入力を閉じる必要があります。
i = IO.popen('node', 'r+')
i.write("console.log('hi')")
i.close_write
print i.read # => hi
明らかに、出力を読み取る前にすべてのコマンドを記述する必要があります。REPL と適切にやり取りしたい場合は、 PTY を作成する必要があります。いくつかのコマンドを実行して出力を出力する小さな例を次に示します。
require 'pty'
require 'expect'
commands = ["console.log('hi')", "var a = 1", "console.log(a)"]
PTY.spawn("node") do |r,w,pid|
# r is node's stdout/stderr and w is stdin
r.expect('>')
commands.each do |cmd|
puts "Command: " + cmd
w.puts cmd
r.expect(/(.*?)\r\n(.*)>/m) {|res| print "Output: " + res[2] }
end
end
ただし、この種の REPL とのやり取りは脆弱になる傾向があります。あなたが何をしようとしているのかはわかりませんが、コマンドを評価し、簡単に解析できる形式で結果を返す小さな JavaScript プログラムを作成することで、より優れたサーバーになる可能性があります。