プロセス「python.exe」を起動するコードがいくつかあります。process.StartInfo.RedirectStandardInput=false を設定すると、リダイレクトされた出力はプロセスからストリームを返します。出力は利用可能で、readOut() または readErr() スレッド ハンドラによって処理されます。ただし、true に設定すると、プロセスからの出力は得られません。Windows フォームからプロセスに入力を送信できるように、入力リダイレクトが必要です。
私は2つのスレッドを持っています.1つはリダイレクトされた出力を処理し、もう1つはリダイレクトされたstderrorを処理します。いくつかの指針を提供していただければ幸いです。ありがとうございました。
私のコードは次のようになります。
....
Process p = new Process();
p.StartInfo.WorkingDirectory = "C:\\";
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
//output is available and processed by readErr if this set to false.
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardError = true;
p.EnableRaisingEvents = true;
p.StartInfo.FileName = this.exe;
readTh = new Thread(readOut);
readTh.Name = "CmdStdOutTh";
errTh = new Thread(readErr);
errTh.Name = "CmdStdErrTh";
lock (this)
{
p.Start();
readTh.Start();
errTh.Start();
}
....
void readOut()
{
char[] buf = new char[256];
int n = 0;
while ((!p.HasExited || (p.StandardOutput.Peek() >= 0)) && !abort) {
n = p.StandardOutput.Read(buf, 0, buf.Length - 1);
buf[n] = '\0';
if (n > 0)
processOutput(new string(buf));
Thread.Sleep(0);
}
}
void readErr() {
char[] buf = new char[256];
while ((!p.HasExited || (p.StandardError.Peek() >= 0)) && !abort) {
int n = p.StandardError.Read(buf, 0, buf.Length - 1);
buf[n] = '\0';
if (n > 0)
processError(new string(buf));
Thread.Sleep(0);
}
}