2017-11-30 1 views
0

Ich versuche, ein R-Skript mit der RScript.exe im Verzeichnis \ bin \ einer R-Installation ausführen. Das Ausführen von RScript über die Windows-Befehlszeile schreibt Ergebnisse auf den Bildschirm. Wenn ich versuche, in C# mit dem System.Diagnostics.Process() zu replizieren, scheint die Ausgabe zu fehlen.Capture stdout von RScript über C#

Für ein einfaches Beispiel, ich werde meine tatsächlichen R-Code ignorieren, und einfach versuchen, Versionsinformationen von RScript.exe zu lesen. Wenn von der Befehlszeile ausführen:

rscript --version 

Ich sehe auf dem Bildschirm

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

Wenn ich das gleiche in diesem C# -Code zu tun, ist nichts gefangen.

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(); 

Es scheint, wie dies sehr einfach sein sollte, aber trotz an vielen Beispielen suchen stdout von C# Fang, bin ich immer noch nicht gefunden.

+0

Meine letzte Vermutung ist, dass RScript nicht in stdout schreibt, wenn es über 'System.Diagnostics.Process()' gestartet wird. Ich habe keine Ahnung, warum das so wäre. –

Antwort

0

Versuchen Sie wie unten angegeben.

Verwenden Sie Process.StandardOutput Eigenschaft. (Sie haben RedirectStandardOutput bereits auf true gesetzt).

Dies gibt eine StreamReader zurück, mit der der Standard-Ausgabestream der Anwendung gelesen werden kann.

ex: nach dem Start des Prozesses ..

string output = proc.StandardOutput.ReadToEnd(); 

Blick in untenstehenden Link für weitere Details.

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

Sie haben vor WaitForExit() zu nennen. Der obige Link erklärt die meisten Konsequenzen.

+0

Entschuldigung, die Zeichenfolge ist auch nach diesen Änderungen immer noch leer. –

+0

Haben Sie die asynchronen Aufrufe BeginOutputReadLine(); ?? – Naidu

+0

Ja, alle Ereignishandler auch auskommentiert. –