2017-11-30 22 views
0

Rインストールの\ bin \ディレクトリにあるRScript.exeを利用してRスクリプトを実行しようとしています。 WindowsのコマンドラインからRScriptを実行すると、結果が画面に表示されます。 System.Diagnostics.Process()を使用してC#でレプリケートしようとすると、出力が失われているようです。RScriptからC#経由でstdoutを取得する

単純な例として、私は実際のrコードを無視して、RScript.exeからバージョン情報を読み取ろうとします。 CMDプロンプトから実行する場合:

rscript --version 
私は画面に表示さ

R scripting front-end version 3.2.3 (2015-12-10) 

私はこのC#コードで同じことを行うと、何もキャプチャされません。

StringBuilder outputBuilder = new StringBuilder(); 

System.Diagnostics.Process proc = new System.Diagnostics.Process(); 

proc.StartInfo.FileName = "rscript"; 
proc.StartInfo.RedirectStandardError = true; 
proc.StartInfo.RedirectStandardOutput = true; 
proc.StartInfo.ErrorDialog = false; 
proc.StartInfo.UseShellExecute = false; 
proc.StartInfo.Arguments = "--version"; 
proc.EnableRaisingEvents = true; 

proc.OutputDataReceived += new DataReceivedEventHandler 
(
    delegate(object sender, DataReceivedEventArgs e) 
    { 
     outputBuilder.Append(e.Data); 
    } 
); 
proc.ErrorDataReceived += new DataReceivedEventHandler 
(
    delegate(object sender, DataReceivedEventArgs e) 
    { 
     outputBuilder.Append(e.Data); 
    } 
); 

proc.Start(); 
proc.BeginOutputReadLine(); 
proc.BeginErrorReadLine(); 

proc.WaitForExit(); 
string allOutput = outputBuilder.ToString(); 

これは非常に単純なはずですが、C#からstdoutをキャプチャする多くの例を見るにもかかわらず、私はまだ困惑しています。

+0

私の最近の推測では、RScriptは 'System.Diagnostics.Process()'で起動するとstdoutに書き込まないということです。私はなぜそれが事実だろうか分かりません。 –

答えて

0

次のようにしてください。

Process.StandardOutputプロパティを使用します。 (すでにRedirectStandardOutputをtrueに設定しています)。

これは、アプリケーションの標準出力ストリームを読み取るために使用できるStreamReaderを返します。

例: ..プロセスを開始した後詳細については、下記リンクに

string output = proc.StandardOutput.ReadToEnd(); 

ルック。

https://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput(v=vs.110).aspx

あなたはWaitForExit()前に呼び出す必要があります。上記のリンクは、ほとんどの結果を説明しています。

+0

申し訳ありませんが、文字列は変更後も空です。 –

+0

非同期呼び出しBeginOutputReadLine();を削除しましたか? – Naidu

+0

はい、すべてのイベントハンドラをコメントアウトしました。 –

関連する問題