我正在尝试编写一个与 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 程序来评估您的命令并以某种易于解析的格式返回结果,您可能会成为更好的服务器。