2016-09-26 47 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。終端顯示字符串的方式與代碼如何生成它們的區分很重要,這聽起來像是你試圖與終端對信息的可視表示進行交互,而不是與代碼生成的輸出進行交互。 –

相關問題