我想写一个与python进程交互的c#应用程序。请参阅下面的示例代码。在启动python进程并写入其StdIn之后,在StdIn流关闭之前不会发生任何事情。当关闭时,通过StdIn提交的代码被执行,然后python进程关闭。我怎样才能让python执行通过StdIn提交的代码,而不必首先关闭StdIn?
StringBuilder strOut = new StringBuilder();
ProcessStartInfo processStartInfo = new ProcessStartInfo();
Process process = new Process();
processStartInfo.CreateNoWindow = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardError = true;
processStartInfo.UseShellExecute = false;
processStartInfo.Arguments = "";
processStartInfo.FileName = "c:\Python39\python.exe";
process.StartInfo = processStartInfo;
process.EnableRaisingEvents = true;
process.OutputDataReceived += new DataReceivedEventHandler
(
delegate (object sndr, DataReceivedEventArgs ee)
{
Console.WriteLine("received=" + ee.Data);
strOut.Append(ee.Data);
}
);
process.ErrorDataReceived += new DataReceivedEventHandler
(
delegate (object sndr, DataReceivedEventArgs ee)
{
Console.WriteLine("error=" + ee.Data);
strOut.Append("Error:" + ee.Data);
}
);
process.Start();
StreamWriter wrtr = process.StandardInput;
process.BeginOutputReadLine();
process.BeginErrorReadLine();
wrtr.WriteLine("import sys");
wrtr.WriteLine("print('Line 1')");
Thread.Sleep(1000);
wrtr.WriteLine("prxint('Line 2')");
wrtr.WriteLine("sys.exit('Test Exit')");
wrtr.Close();
Thread.Sleep(1000);
process.WaitForExit();
process.CancelOutputRead();
string output = strOut.ToString();
Python尝试检测它在什么环境下运行。它切换到非交互模式,因为它不是运行在终端窗口由于UseShellExecute = false
。您可以通过传递-i
参数来强制交互模式:processStartInfo.Arguments = "-i";
您也可以添加-q
以禁用版权和版本消息