我有一些代码启动进程“python.exe”,如果我设置process.StartInfo.RedirectStandardInput = false,重定向输出将从进程返回流,输出可用并由readOut()或readErr()处理线程处理程序。但是,如果我将其设置为true,我将无法从该过程获得任何输出。我需要输入重定向,以便我可以从Windows表单向进程发送输入。
我有2个线程,一个处理重定向的输出,另一个处理重定向的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);
}
}
答案 0 :(得分:0)
确保等到p完成后,使用
p.WaitForExit();
你的例子似乎遗漏了这一点。据我所知,其余的都是正确的,虽然也许可以写得更好:如果写的,看起来如果没有可用的输出,你的代码会旋转,等待。这将不必要地烧掉CPU。相反,只需继续并调用Read:它将阻塞直到足够,所以这将释放其他线程或进程的CPU。
答案 1 :(得分:0)
我已经找到了问题所在。 “p.StartInfo.RedirectStandardInput = true”正常工作。问题出在Python.exe中。我要为StartInfo.Arguments使用“-i”arg选项。它在
中解释Redirect Python standard input/output to C# forms application