2016-09-26 9 views
1

私は、私のためにレーキタスクを実行し、出力をキャプチャするルビープログラムを持っています。今、彼らはPTY.spawnの中で動いています。私はこのアプローチの2つの問題を経験しています:生成されたプロセスと対話し、その出力をルビでキャプチャするには?

  1. 私はchildプロセス内でbinding.pryを使用することはできません。
  2. 独自の出力(プログレスバーの宝石など)を書き直すプロセスは出力を生成しますが、以前の出力を削除することはできませんので、1行が期待されるプログレッシブ出力が得られます。

私は問題を解決する必要があります。私が2番目の問題をプロセス中に取り除くことができればいいと思う。

答えて

0

Pryは、子プロセスに適用されるリモートプロセスのデバッグをサポートしています。 「pry-remote」を検索します。

以前の出力を削除する限り、実際に何が起こっているのか分かりません。 TTYの仕組みについて考える必要があります。以前の出力は削除されません。代わりに、改行ではなく改行を使用してカーソルが行の先頭に移動します。

出力をキャプチャして、行区切りを維持するlinesを使用して、配列に分割して最初または最後の行を取得することができます。例えば:

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

1.未PRY-リモートに興味:

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を使用することができます。それは実行可能な回避策ですが、私はむしろ直接それを解決したいと思います。 2.進捗バーの宝石は進捗状況を表示します。それが変更されると、その行が更新されます。対話型端末で実行すると、行が編集されて置き換えられます。 PTY.spawnで実行すると、行が累積します。私はそれが何をしているのか理解しています、私はインタラクティブなもののように動作する別のプロセスを生成する方法がわかりません。 – valadil

+0

「直接」を定義します。環境を変更して起動したときにコマンドラインで開始されたと思って、それがTTYによって開始されたと思うようにするには、コードを欺く必要があります。しかし、私はあなたがルビーをだまそうとしているように、ドラゴンズに満ちた道を右に導くだろうと思う。端末が文字列を表示する方法とコードがそれらを生成する方法を区別することは、理解することが重要です。コードの生成された出力ではなく、端末の情報の視覚的表現と対話しようとしているようです。 –

関連する問題