【问题标题】:How to interact with a spawned process and capture its output in ruby?如何与生成的进程交互并在 ruby​​ 中捕获其输出?
【发布时间】:2016-09-26 14:54:37
【问题描述】:

我有一个 ruby​​ 程序,它为我运行 rake 任务并捕获输出。现在它们正在 PTY.spawn 中运行。我在使用这种方法时遇到了两个问题:

  1. 我无法在子进程中使用 binding.pry。
  2. 重写自己的输出(例如进度条 gem)的进程会产生输出,但不能删除以前的输出,所以我会在预期一行的地方得到一堆渐进式输出。

我需要解决撬动问题。如果我能在此过程中解决第二个问题,那就太好了。

【问题讨论】:

    标签: ruby spawn pry


    【解决方案1】:

    Pry 支持调试远程进程,这应该适用于子进程。搜索“pry-remote”。

    至于删除之前的输出,你似乎不明白到底发生了什么;您必须考虑 TTY 是如何工作的。先前的输出不会被删除,而是使用回车符而不是换行符将光标移动到行首。

    您可以捕获输出并使用维护行分隔符的lines 将其分解为数组并获取第一行或最后一行。例如:

    text = "this is the first line."
    text += "\rthis is another line."
    text += "\rthis is the last line."
    text # => "this is the first line.\rthis is another line.\rthis is the last line."
    
    text.lines("\r").first # => "this is the first line.\r"
    text.lines("\r").last # => "this is the last line."
    

    您也可以使用split,它返回行分隔符:

    text.split("\r").first # => "this is the first line."
    text.split("\r").last # => "this is the last line."
    

    【讨论】:

    • 1.对 pry-remote 不感兴趣。这是一个可行的解决方法,但我宁愿直接解决它。 2. 进度条 gem 打印一行进度。然后,当它发生变化时,它会更新该行。当我在交互式终端中运行它时,该行被编辑和替换。当我在 PTY.spawn 中运行它时,线条会累积。我明白它在做什么,我只是不确定如何生成另一个像交互式进程一样工作的进程。
    • “直接”定义。如果您希望代码在通过更改其环境生成时认为它是从命令行启动的,那么您将不得不欺骗代码,因此它认为它是由 TTY 启动的。但我怀疑这会导致一条充满龙的道路,因为你也会试图愚弄 Ruby。终端如何显示字符串与代码如何生成字符串的分离是很重要的理解;听起来您正在尝试与终端的信息视觉表示进行交互,而不是与代码生成的输出进行交互。
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 2018-11-03
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    相关资源
    最近更新 更多