如何与Ruby中的节点REPL进行交互

时间:2012-06-22 17:20:23

标签: ruby node.js io read-eval-print-loop

我正在尝试编写一个与Node.js REPL交互的Ruby脚本。当我这样做时:

i = IO.popen('node', 'r+')
i.write("console.log('hi')")

写调用返回写的大小。但是如何取回REPL的输出进行处理?我已经尝试了#read,但它没有返回输出。

1 个答案:

答案 0 :(得分:0)

当您将内容传递给node时,它希望从stdin读取整个脚本。要使上述代码有效,您需要在读取输出之前关闭输入。

i = IO.popen('node', 'r+')
i.write("console.log('hi')")
i.close_write
print i.read   # => hi

显然,您需要在读取任何输出之前编写所有命令。如果要与REPL正确交互,则需要创建a 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程序来改进你的命令并以一些易于解析的格式返回结果,从而成为更好的服务器。