【问题标题】:How to interact with a node REPL from Ruby如何与来自 Ruby 的节点 REPL 交互
【发布时间】:2012-06-22 17:20:22
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    当您通过管道将内容传送到node 时,它希望从标准输入读取整个脚本。要使上述代码正常工作,您需要先关闭输入,然后才能读取输出。

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

    【讨论】:

    • 这正是我想要的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2019-07-19
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多