我正在尝试编写一个与Node.js REPL交互的Ruby脚本。当我这样做时:
i = IO.popen('node', 'r+')
i.write("console.log('hi')")
写调用返回写的大小。但是如何取回REPL的输出进行处理?我已经尝试了#read,但它没有返回输出。
答案 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程序来改进你的命令并以一些易于解析的格式返回结果,从而成为更好的服务器。