2016-09-26 49 views
1

我有一个ruby程序,为我运行rake任务并捕获输出。现在他们正在PTY.spawn中运行。我遇到了这种方法的两个问题:如何与产生的进程进行交互并在ruby中捕获它的输出?

  1. 我不能在子进程中使用binding.pry。
  2. 重写自己的输出(如进度条gem)的过程会产生输出,但无法删除先前的输出,因此我会得到一堆预计会出现一行的渐进式输出。

我需要解决pry问题。如果我能在这个过程中让第二个问题消失,那将会很好。

回答

0

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." 
+0

1.撬远程不感兴趣。这是一个可行的解决方法,但我宁愿直接解决它。 2.进度条gem打印一行进度。然后当它改变它更新那条线。当我在交互式终端中运行它时,该行会被编辑和替换。当我在PTY.spawn中运行它时,线条会累积。我明白它在做什么,我只是不确定如何产生另一个像交互式过程那样工作的过程。 – valadil

+0

定义“直接”。如果你想让它认为它是在命令行启动的,那么通过改变它的环境来产生它,所以它认为它是由TTY启动的,你将不得不愚弄代码。但是我怀疑这会导致一条充满龙的道路,因为你也会试图欺骗Ruby。终端显示字符串的方式与代码如何生成它们的区分很重要,这听起来像是你试图与终端对信息的可视表示进行交互,而不是与代码生成的输出进行交互。 –